home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / prodpack.zip / DB4PPSAM.EXE / OPENFILE.PRG < prev    next >
Text File  |  1993-05-25  |  74KB  |  2,529 lines

  1. *-- DBW - Dialog Box Workshop - OPENFILE.PRG
  2. PROCEDURE OPENFILE
  3. *----------------------------------------------------------------------------
  4. * NAME
  5. * DESCRIPTION
  6. *----------------------------------------------------------------------------
  7.   PRIVATE  cAlias, cWindow, lTalk, lSafety, cDialog, cHelpFile, cStartLib
  8.  
  9.   IF SET( "TALK" ) = "ON"
  10.     SET TALK OFF
  11.     lTalk = .T.
  12.   ELSE
  13.     lTalk = .F.
  14.   ENDIF
  15.  
  16.   lSafety = SET( "SAFETY" ) = "ON"
  17.   SET SAFETY OFF
  18.  
  19.   cWindow = WINDOW()
  20.   cAlias = ALIAS()
  21.  
  22.   *----------------------------------
  23.   *-- Setup the help system variables
  24.   *----------------------------------
  25.   lError = .F.
  26.   cHelpFile = "DBBHELP"
  27.   cDialog = "OPENFILE"
  28.   cDBBLib = "DBBLIB"
  29.  
  30.   *----------------------------------------------
  31.   *-- Setup the link to the DBB Procedure Library
  32.   *----------------------------------------------
  33.   ON ERROR lError = .T.
  34.   cStartLib = SET( "PROCEDURE" )
  35.   SET PROCEDURE TO ( cDBBLib )
  36.   IF lError
  37.     lError = .F.
  38.     SET PROCEDURE TO HOME() + cDBBLib
  39.     IF lError
  40.       *-- Display the error message in a windowed box
  41.       PRIVATE lc_anykey, lc_msg, lc_msglen, lc_win, ln_press, ln_width, ll_trap,;
  42.               ll_escape
  43.  
  44.       lc_anykey = [Press any key to continue...]
  45.       ln_press  = LEN( lc_anykey )
  46.       lc_msg    = [Could not locate procedure file: ] + cDBBLib
  47.       ln_msglen = LEN( lc_msg )
  48.       ln_width = 0
  49.       ll_escape = SET("ESCAPE") = "ON"
  50.       SET ESCAPE OFF
  51.  
  52.       *-- Determine the width needed for the window:
  53.       IF ln_msglen <= ln_press
  54.         ln_width = ln_press
  55.       ELSE
  56.         *-- Make sure the message fits in the window:
  57.         IF ln_msglen > 76
  58.           lc_msg = LEFT( lc_msg, 76 )
  59.           ln_msglen = 76
  60.         ENDIF
  61.         ln_width = ln_msglen
  62.       ENDIF
  63.       DEFINE WINDOW _err_box FROM 9, ((76 - ln_width) + .5) / 2 ;
  64.                     TO 15, (ln_width + 83) / 2 DOUBLE
  65.       ln_width = ( ln_width + 2 )
  66.  
  67.       *-- Display the message and prompt to the window and wait for a key press
  68.       ACTIVATE WINDOW _err_box
  69.       ? lc_msg AT ( ln_width - ln_msglen ) / 2
  70.       ?
  71.       ? lc_anykey AT ( ln_width - ln_press ) / 2
  72.       SET CONSOLE OFF
  73.       WAIT
  74.       SET CONSOLE ON
  75.  
  76.       *-- Clean up the window display and reactivate the previous window
  77.       RELEASE WINDOW _err_box
  78.  
  79.       IF ll_escape
  80.         SET ESCAPE ON
  81.       ELSE
  82.         SET ESCAPE OFF
  83.       ENDIF
  84.  
  85.     ENDIF
  86.   ENDIF
  87.   ON ERROR
  88.  
  89.   *---------------------------------
  90.   *-- Run the actual dialog box code
  91.   *---------------------------------
  92.   IF .NOT. lError
  93.     DO Dialog
  94.   ENDIF
  95.  
  96.   *----------------------------------
  97.   *-- Restore the startup environment
  98.   *----------------------------------
  99.   IF .NOT. ISBLANK( cStartLib )
  100.     SET PROCEDURE TO ( cStartLib )
  101.   ENDIF
  102.  
  103.   IF .NOT. ISBLANK( cAlias ) .AND. SELECT( cAlias ) > 0
  104.     SELECT ( cAlias )
  105.   ENDIF
  106.  
  107.   IF lSafety
  108.     SET SAFETY ON
  109.   ENDIF
  110.   IF lTalk
  111.     SET TALK ON
  112.   ENDIF
  113.   IF .NOT. ISBLANK( cWindow )
  114.     ACTIVATE WINDOW &cWindow
  115.   ENDIF
  116. RETURN
  117. *-- EOP: OPENFILE
  118.  
  119.  
  120. PROCEDURE Dialog
  121. *----------------------------------------------------------------------------
  122. * NAME
  123. *   Dialog -
  124. *
  125. * DESCRIPTION
  126. *
  127. *----------------------------------------------------------------------------
  128.  
  129.   *---------------------------------------
  130.   *-- Temporary for now, message varaibles
  131.   *---------------------------------------
  132.   DLN_OK       = -500
  133.   DLN_CANCEL   = -501
  134.   DLN_HELP     = -502
  135.  
  136.   WM_PAINT    = 15                      && Notification to repaint client area
  137.   WM_CLOSE    = 16                      && Note that user selected close button
  138.   WM_DRAWITEM = 43                      && Notification to the owner of an
  139.  
  140.   BN_CLICKED  = 0
  141.   BN_PAINT    = 1
  142.   BN_HILITE   = 2
  143.   BN_UNHILITE = 3
  144.   BN_DISABLE  = 4
  145.   BN_DEFAULT  = 6
  146.   BN_PRESSED  = 7
  147.   BN_COLOR    = 8
  148.   SE_SHADOW   = -100
  149.  
  150.   EN_SETFOCU  = 1
  151.   EN_KILLFOC  = 2
  152.  
  153.   CB_SELECTS  = 13
  154.   CB_SHOWDRO  = 15
  155.   CB_HIDELST  = 25
  156.  
  157.   CBN_SELCHAN = 1
  158.   CBN_DBLCLK  = 2
  159.   CBN_SETFOCU = 3
  160.   CBN_KILLFOC = 4
  161.   CBN_EDITCHA = 5
  162.   CBN_EDITUPD = 6
  163.   CBN_DROPDOW = 7
  164.   CBN_INLIST  = 8
  165.  
  166.   LBN_SELCHA  =  1
  167.   LBN_DBLCLK  =  2
  168.   LBN_SELCAN  =  3
  169.   LBN_SETFOC  =  4
  170.   LBN_KILLFO  =  5
  171.  
  172.   KB_TAB = 9
  173.   KB_ENTER = 13
  174.   KB_SPACE = 32
  175.   KB_SHIFTTAB = -400
  176.   KB_UPARROW = 5
  177.   KB_DOWNARROW = 24
  178.   KB_LEFTARROW = 19
  179.   KB_RTARROW = 4
  180.   KB_F1 = 28
  181.   KB_ESC = 27
  182.   KB_MOUSE = -100
  183.   KB_CTRLW = 23
  184.  
  185.   *--------------------
  186.   *-- Working variables
  187.   *--------------------
  188.   PRIVATE nCurrent, nCurrGrp, lButtAct, nMRow, nMCol, nMsEvent, nDlgDef, nAccel
  189.   PRIVATE n1stGrp, nCancelBt
  190.   nCurrent  = 0                         && Current dialog object id
  191.   nCurrGrp  = 0                         && Current group id for object id
  192.   lButtAct  = .F.                       && Dialog has a button active
  193.   nMRow     = -1
  194.   nMCol     = -1
  195.   nMsEvent  = 0
  196.   nDlgDef   = 0
  197.   nAccel    = 0
  198.   n1stGrp   = 0
  199.   nCancelBt = 0                         && Id for cancel button
  200.  
  201.   PRIVATE nDefButt, nMess
  202.   nDefButt  = 0                         && Number of object with default button
  203.   nMess     = 0
  204.  
  205.   PRIVATE cOldFClr, cOldBClr, cOldHClr, cOldMClr, cOldNClr, cOldTClr
  206.   cOldFClr = _ColorChk( "F" )
  207.   cOldBClr = _ColorChk( "B" )
  208.   cOldHClr = _ColorChk( "H" )
  209.   cOldMClr = _ColorChk( "M" )
  210.   cOldNClr = _ColorChk( "N" )
  211.   cOldTClr = _ColorChk( "T" )
  212.  
  213.   SET COLOR OF FIELDS TO w+/b
  214.   SET COLOR OF BOX TO n/gb
  215.   SET COLOR OF HIGH TO w+/g
  216.   SET COLOR OF MESS TO n/gb
  217.   SET COLOR OF TITLE TO n/gb
  218.  
  219.   *------------------------
  220.   *-- Close Icon for window
  221.   *------------------------
  222.   PRIVATE nRowCls, nOrigRow, nOrigCol, nXoffset, nYOffset, nCol, ;
  223.           nHigh, nWidth, nLColCls, nRColCls, nRWinCol, cField, cClass, nScreen
  224.   cField = ""
  225.   cClass = ""
  226.  
  227.   nRowCls   = 2
  228.   nOrigRow  = 2
  229.   nOrigCol  = 13
  230.   nXOffset  = 0
  231.   nYOffset  = 0
  232.   nCol      = 13
  233.   nHigh     = 18
  234.   nWidth    = 60
  235.   nLColCls  = 15
  236.   nRColCls  = 17
  237.   nRWinCol  = 72
  238.   nScreen = IIF( "50" $ SET("DISPLAY"), 49, ;
  239.                 IIF( "43" $ SET("DISPLAY"), 42, 24 ) )
  240.   IF SET( "STATUS" ) = "ON"
  241.     nScreen = nScreen - 3
  242.   ENDIF
  243.  
  244.   PRIVATE nClkBox, nClkObj, aClkBox, aClkObj, aObjPoint
  245.   *--------------------------------------------------
  246.   *-- Get the number of clickable boxes in the dialog
  247.   *--------------------------------------------------
  248.   nClkBox = 1
  249.   DECLARE aClkBox[ 1 , 6 ]
  250.   aClkBox[ 1 , 1 ] = 6                  && CS_FILE_1 
  251.   aClkBox[ 1 , 2 ] = 11
  252.   aClkBox[ 1 , 3 ] = 16
  253.   aClkBox[ 1 , 4 ] = 14
  254.   aClkBox[ 1 , 5 ] = 6
  255.   aClkBox[ 1 , 6 ] = .F.                 && Clink in the box flag
  256.  
  257.   *--------------------------------------------------
  258.   *-- Get the number of clickable items in the dialog
  259.   *--------------------------------------------------
  260.   nClkObj = 6
  261.   DECLARE aClkObj[ 6 , 13 ]
  262.   aClkObj[ 1 , 1 ] = 5                  && Row
  263.   aClkObj[ 1 , 2 ] = 15                 && Col
  264.   aClkObj[ 1 , 3 ] = 29                 && Decimals
  265.   aClkObj[ 1 , 4 ] = 5                  && CurrentId
  266.   aClkObj[ 1 , 5 ] = 3                  && GroupId
  267.   aClkObj[ 1 , 6 ] = 7                  && NextId
  268.   aClkObj[ 1 , 7 ] = 21                 && PrevId
  269.   aClkObj[ 1 , 8 ] = " "                && PickKey
  270.   aClkObj[ 1 , 9 ] = 5                  && Previous item in group
  271.   aClkObj[ 1 ,10 ] = 5                  && Next item in group
  272.   aClkObj[ 1 ,11 ] = "CS_FILE_1"         && XXXXXXXXXXXXXXX
  273.   aClkObj[ 1 ,12 ] = []
  274.   aClkObj[ 1 ,13 ] = []
  275.  
  276.   aClkObj[ 2 , 1 ] = 5                  && Row
  277.   aClkObj[ 2 , 2 ] = 33                 && Col
  278.   aClkObj[ 2 , 3 ] = 65                 && Decimals
  279.   aClkObj[ 2 , 4 ] = 7                  && CurrentId
  280.   aClkObj[ 2 , 5 ] = 4                  && GroupId
  281.   aClkObj[ 2 , 6 ] = 15                 && NextId
  282.   aClkObj[ 2 , 7 ] = 5                  && PrevId
  283.   aClkObj[ 2 , 8 ] = " "                && PickKey
  284.   aClkObj[ 2 , 9 ] = 7                  && Previous item in group
  285.   aClkObj[ 2 ,10 ] = 7                  && Next item in group
  286.   aClkObj[ 2 ,11 ] = "CL_TYPE_1"         && XXXXXXXXXXXXXXXXXXXXXXXXXXXXX [v]
  287.   aClkObj[ 2 ,12 ] = []
  288.   aClkObj[ 2 ,13 ] = []
  289.  
  290.   aClkObj[ 3 , 1 ] = 14                 && Row
  291.   aClkObj[ 3 , 2 ] = 40                 && Col
  292.   aClkObj[ 3 , 3 ] = 52                 && Decimals
  293.   aClkObj[ 3 , 4 ] = 15                 && CurrentId
  294.   aClkObj[ 3 , 5 ] = 12                 && GroupId
  295.   aClkObj[ 3 , 6 ] = 19                 && NextId
  296.   aClkObj[ 3 , 7 ] = 7                  && PrevId
  297.   aClkObj[ 3 , 8 ] = "R"                && PickKey
  298.   aClkObj[ 3 , 9 ] = 15                 && Previous item in group
  299.   aClkObj[ 3 ,10 ] = 15                 && Next item in group
  300.   aClkObj[ 3 ,11 ] = "CK_READ_1"         && [ ] ~Read-only
  301.   aClkObj[ 3 ,12 ] = []
  302.   aClkObj[ 3 ,13 ] = []
  303.  
  304.   aClkObj[ 4 , 1 ] = 17                 && Row
  305.   aClkObj[ 4 , 2 ] = 32                 && Col
  306.   aClkObj[ 4 , 3 ] = 44                 && Decimals
  307.   aClkObj[ 4 , 4 ] = 19                 && CurrentId
  308.   aClkObj[ 4 , 5 ] = 19                 && GroupId
  309.   aClkObj[ 4 , 6 ] = 20                 && NextId
  310.   aClkObj[ 4 , 7 ] = 15                 && PrevId
  311.   aClkObj[ 4 , 8 ] = "D"                && PickKey
  312.   aClkObj[ 4 , 9 ] = 19                 && Previous item in group
  313.   aClkObj[ 4 ,10 ] = 19                 && Next item in group
  314.   aClkObj[ 4 ,11 ] = "BT_DEMO"           &&  ~Demo dialog
  315.   aClkObj[ 4 ,12 ] = []
  316.   aClkObj[ 4 ,13 ] = []
  317.  
  318.   aClkObj[ 5 , 1 ] = 17                 && Row
  319.   aClkObj[ 5 , 2 ] = 49                 && Col
  320.   aClkObj[ 5 , 3 ] = 56                 && Decimals
  321.   aClkObj[ 5 , 4 ] = 20                 && CurrentId
  322.   aClkObj[ 5 , 5 ] = 20                 && GroupId
  323.   aClkObj[ 5 , 6 ] = 21                 && NextId
  324.   aClkObj[ 5 , 7 ] = 19                 && PrevId
  325.   aClkObj[ 5 , 8 ] = " "                && PickKey
  326.   aClkObj[ 5 , 9 ] = 20                 && Previous item in group
  327.   aClkObj[ 5 ,10 ] = 20                 && Next item in group
  328.   aClkObj[ 5 ,11 ] = "BT_OK"             &&    Ok
  329.   aClkObj[ 5 ,12 ] = []
  330.   aClkObj[ 5 ,13 ] = [The file name must not be blank]
  331.  
  332.   aClkObj[ 6 , 1 ] = 17                 && Row
  333.   aClkObj[ 6 , 2 ] = 62                 && Col
  334.   aClkObj[ 6 , 3 ] = 69                 && Decimals
  335.   aClkObj[ 6 , 4 ] = 21                 && CurrentId
  336.   aClkObj[ 6 , 5 ] = 21                 && GroupId
  337.   aClkObj[ 6 , 6 ] = 5                  && NextId
  338.   aClkObj[ 6 , 7 ] = 20                 && PrevId
  339.   aClkObj[ 6 , 8 ] = " "                && PickKey
  340.   aClkObj[ 6 , 9 ] = 21                 && Previous item in group
  341.   aClkObj[ 6 ,10 ] = 21                 && Next item in group
  342.   aClkObj[ 6 ,11 ] = "BT_CANCEL"         &&  Cancel
  343.   aClkObj[ 6 ,12 ] = []
  344.   aClkObj[ 6 ,13 ] = []
  345.  
  346.   nCancelBt = 21
  347.  
  348.  
  349.   *-------------------------------------------------------------
  350.   *-- Setup object pointers in to the current object array above
  351.   *-------------------------------------------------------------
  352.   DECLARE aObjPoint[ 21 ]
  353.   aObjPoint[ 5 ] = 1
  354.   aObjPoint[ 7 ] = 2
  355.   aObjPoint[ 15 ] = 3
  356.   aObjPoint[ 19 ] = 4
  357.   aObjPoint[ 20 ] = 5
  358.   aObjPoint[ 21 ] = 6
  359.  
  360.   *-------------------------------------------------------------------
  361.   *-- Setup private memory variables for object states (from InitObjs)
  362.   *-- First variable with the object memvar name contains the value
  363.   *-- for the object.  The second varaible, if present, indicates
  364.   *-- the id of the object previously active in the group.
  365.   *-------------------------------------------------------------------
  366.   PRIVATE cs_file_1
  367.   cs_file_1   = ""
  368.   PRIVATE nCs_file
  369.   nCs_file = 0
  370.   PRIVATE cl_type_1
  371.   cl_type_1   = ""
  372.   PRIVATE nCl_type
  373.   nCl_type = 0
  374.   PRIVATE ck_read_1
  375.   ck_read_1   = ""
  376.   PRIVATE nCk_read
  377.   nCk_read = 15
  378.   PRIVATE bt_demo
  379.   bt_demo     = ""
  380.   PRIVATE bt_ok
  381.   bt_ok       = ""
  382.   PRIVATE bt_cancel
  383.   bt_cancel   = ""
  384.  
  385.   DO InitObjs
  386.  
  387.   DO DrawDial                           && Draw all the dialog objects
  388.  
  389.   *--------------------------------
  390.   *-- Set focus to the first object
  391.   *--------------------------------
  392.   DO GetNext WITH nCurrent, .T.
  393.  
  394.   *-- The message loop
  395.   nMess = 0
  396.   DO WHILE .NOT. GetMess()
  397.     DO Dispatch
  398.     IF nMess = DLN_OK .OR. nMess = DLN_CANCEL
  399.       EXIT
  400.     ENDIF
  401.  
  402.   ENDDO
  403.  
  404.   IF nMess = DLN_OK
  405.     DO PostVals
  406.     FXL_Cancel = .F.
  407.   ELSE
  408.     FXL_Cancel = .T.
  409.   ENDIF
  410.  
  411.   RELEASE WINDOW OPENFILE
  412.   RESTORE SCREEN FROM OPENFILE
  413.   RELEASE SCREEN OPENFILE
  414.  
  415.   DO ReleObjs
  416.  
  417.   SET COLOR OF FIELDS TO &cOldFClr
  418.   SET COLOR OF BOX TO &cOldBClr
  419.   SET COLOR OF HIGH TO &cOldHClr
  420.   SET COLOR OF MESS TO &cOldMClr
  421.   SET COLOR OF TITLE TO &cOldTClr
  422.   SET CURSOR ON
  423.  
  424. RETURN
  425. *-- EOP: Dialog
  426.  
  427. PROCEDURE InitObjs
  428. *----------------------------------------------------------------------------
  429. * NAME
  430. *   InitObjs - Scan the design DBF file and initialize the object variables
  431. *
  432. * DESCRIPTION
  433. *
  434. *----------------------------------------------------------------------------
  435.   PRIVATE cField, cClass, cDefault, Value, lInitDef
  436.  
  437.   *--------------------------------------------------
  438.   *-- Determine if an initialization array is present
  439.   *--------------------------------------------------
  440.   lInitDef = TYPE( "OPENFILE[1]" ) <> "U"
  441.  
  442.   *-------------------------------
  443.   *-- Set the default button value
  444.   *-------------------------------
  445.   nDlgDef =  20
  446.  
  447.   *-----------------------------------------------------------------
  448.   *-- If the Initialize array is present, then set the object values
  449.   *-- based on the array.
  450.   *-----------------------------------------------------------------
  451.   IF lInitDef
  452.     CS_FILE_1 = OPENFILE[ 1 ]
  453.     CL_TYPE_1 = OPENFILE[ 2 ]
  454.     CK_READ_1 = OPENFILE[ 3 ]
  455.     BT_DEMO = OPENFILE[ 4 ]
  456.     BT_OK = OPENFILE[ 5 ]
  457.     BT_CANCEL = OPENFILE[ 6 ]
  458.   ELSE
  459.     *--------------------------------------------------------
  460.     *-- Otherwise, use the values stored in the resource file
  461.     *--------------------------------------------------------
  462.     CS_FILE_1 = "*.SCR                                                                           "
  463.     CL_TYPE_1 = "SCREEN FILES (*.SCR)             "
  464.     CK_READ_1 = .F.
  465.     BT_DEMO = .F.
  466.     BT_OK = .T.
  467.     BT_CANCEL = .F.
  468.   ENDIF
  469.   nCurrent  = 5                         && Current dialog object id
  470.   nCurrGrp  = 3                         && Current group id for object id
  471.   n1stGrp   = 3
  472.  
  473. RETURN
  474. *-- EOP: InitObjs
  475.  
  476. PROCEDURE DrawDial
  477. *----------------------------------------------------------------------------
  478. * NAME
  479. *   DrawDial -
  480. *
  481. * DESCRIPTION
  482. *
  483. *----------------------------------------------------------------------------
  484.   PRIVATE lInitDef
  485.   lInitDef = TYPE( "OPENFILE[1]" ) <> "U"
  486.   IF FILE( "OPENFILE.WIN" ) .AND. ( .NOT. lInitDef .OR. ;
  487.      ( TYPE( "FXL_NoChng" ) = "L" .AND. FXL_NoChng ) )
  488.     *--------------------
  489.     *-- Dialog box shadow
  490.     *--------------------
  491.     SAVE SCREEN TO OPENFILE
  492.     ACTIVATE SCREEN
  493.     @ 3, 14 FILL TO 20, 73
  494.  
  495.     RESTORE WINDOW OPENFILE FROM OPENFILE
  496.     ACTIVATE WINDOW OPENFILE
  497.     DO TCombo WITH WM_PAINT, CB_SHOWDRO, 5
  498.     DO TCombo WITH WM_PAINT, CB_HIDELST, 7
  499.   ELSE
  500.     *-------------------------
  501.     *-- Draw the dialog window
  502.     *-------------------------
  503.     *--------------------
  504.     *-- Dialog box shadow
  505.     *--------------------
  506.     SAVE SCREEN TO OPENFILE
  507.     ACTIVATE SCREEN
  508.     @ 3, 14 FILL TO 20, 73
  509.  
  510.     DEFINE WINDOW OPENFILE FROM  2,13 TO 19,72 NONE COLOR n/w
  511.     ACTIVATE WINDOW OPENFILE
  512.     @ 0, 0 TO 17 , 59 DOUBLE COLOR w+/w
  513.     *------------------------
  514.     *-- Close Icon for window
  515.     *------------------------
  516.     @ 0, 2 SAY "[ ]" COLOR w+/w
  517.     @ 0, 3 SAY CHR( 254 ) COLOR g+/w
  518.  
  519.     *---------------------------------
  520.     *-- Draw the other control objects
  521.     *---------------------------------
  522.     @ 0,22 SAY " Open file" COLOR w+/w
  523.     @ 10,25 SAY "┌──────────────────" COLOR n/w
  524.     @ 10,44 SAY "┐" COLOR w+/w
  525.     @ 11,25 SAY "│" COLOR n/w
  526.     @ 11,44 SAY "│" COLOR w+/w
  527.     @ 12,25 SAY "│" COLOR n/w
  528.     @ 12,44 SAY "│" COLOR w+/w
  529.     @ 13,25 SAY "└" COLOR n/w
  530.     @ 13,26 SAY "──────────────────┘" COLOR w+/w
  531.     DO TStatic WITH WM_PAINT, BN_PAINT, 3
  532.     DO TEdit WITH WM_PAINT, EN_KILLFOC, 5
  533.     DO TCombo WITH WM_PAINT, CB_SHOWDRO, 5
  534.     DO TStatic WITH WM_PAINT, BN_PAINT, 4
  535.     DO TCombo WITH WM_PAINT, CB_HIDELST, 7
  536.     DO TStatic WITH WM_PAINT, BN_PAINT, 12
  537.     DO TButton WITH WM_PAINT, BN_PAINT, 15
  538.     DO TButton WITH WM_PAINT, BN_PAINT, 19
  539.     DO TButton WITH WM_PAINT, SE_SHADOW, 19
  540.     DO TButton WITH WM_PAINT, BN_PAINT, 20
  541.     DO TButton WITH WM_PAINT, SE_SHADOW, 20
  542.     DO TButton WITH WM_PAINT, BN_PAINT, 21
  543.     DO TButton WITH WM_PAINT, SE_SHADOW, 21
  544.     IF .NOT. lInitDef
  545.       SAVE WINDOW OPENFILE TO OPENFILE
  546.     ENDIF
  547.   ENDIF
  548. RETURN
  549. *-- EOP: DrawDial
  550.  
  551.  
  552.  
  553. PROCEDURE TStatic
  554. PARAMETERS pn_msg, pc_data, pnObject
  555. *----------------------------------------------------------------------------
  556. * NAME
  557. *   TStatic -
  558. *
  559. * DESCRIPTION
  560. *
  561. * PARAMETERS
  562. *   pn_msg     =
  563. *   pc_data    =
  564. *   pnObject   =
  565. *
  566. *----------------------------------------------------------------------------
  567.   DO CASE
  568.     CASE pnObject = 3
  569.       DO CASE
  570.         CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  571.           @ 2, 2 SAY "File name:" COLOR n/w
  572.         CASE pc_data = BN_HILITE
  573.           @ 2, 2 SAY "File name:" COLOR w+/w
  574.         CASE pc_data = BN_DISABLE
  575.           @ 2, 2 SAY "File name:" COLOR n+/w
  576.         CASE pc_data = BN_COLOR
  577.           @ 2, 2 SAY "File name:" COLOR w+/n
  578.       ENDCASE
  579.       IF pc_data <> BN_DISABLE
  580.         @ 2, 7 SAY "n" COLOR gr+/w
  581.       ENDIF
  582.     CASE pnObject = 4
  583.       DO CASE
  584.         CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  585.           @ 2, 20 SAY "List Files of Type:" COLOR n/w
  586.         CASE pc_data = BN_HILITE
  587.           @ 2, 20 SAY "List Files of Type:" COLOR w+/w
  588.         CASE pc_data = BN_DISABLE
  589.           @ 2, 20 SAY "List Files of Type:" COLOR n+/w
  590.         CASE pc_data = BN_COLOR
  591.           @ 2, 20 SAY "List Files of Type:" COLOR w+/n
  592.       ENDCASE
  593.       IF pc_data <> BN_DISABLE
  594.         @ 2, 34 SAY "T" COLOR gr+/w
  595.       ENDIF
  596.     CASE pnObject = 12
  597.       DO CASE
  598.         CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  599.           @ 11, 27 SAY "Open file mode:" COLOR n/w
  600.         CASE pc_data = BN_HILITE
  601.           @ 11, 27 SAY "Open file mode:" COLOR w+/w
  602.         CASE pc_data = BN_DISABLE
  603.           @ 11, 27 SAY "Open file mode:" COLOR n+/w
  604.         CASE pc_data = BN_COLOR
  605.           @ 11, 27 SAY "Open file mode:" COLOR n/w
  606.       ENDCASE
  607.   ENDCASE
  608.  
  609. RETURN
  610. *-- EOP: TStatic WITH pn_msg, pc_data, pnObject
  611.  
  612. PROCEDURE HasTitle
  613. PARAMETERS pnObject, pnWay
  614. *----------------------------------------------------------------------------
  615. * NAME
  616. *   HasTitle - Display the label for the group of objects
  617. *
  618. * DESCRIPTION
  619. *
  620. * PARAMETERS
  621. *   pnObject   = nCurrent value for group item
  622. *   pnWay      = BN_HILITE, BN_UNHILITE, or BN_DISABLE
  623. *
  624. *----------------------------------------------------------------------------
  625.   DO CASE
  626.     CASE pnObject = 5
  627.       DO TStatic WITH WM_PAINT, pnWay, 3
  628.     CASE pnObject = 7
  629.       DO TStatic WITH WM_PAINT, pnWay, 4
  630.     CASE pnObject = 15
  631.       DO TStatic WITH WM_PAINT, pnWay, 12
  632.  
  633.   ENDCASE
  634.  
  635. *-- EOP: HasTitle WITH pnObject, pnWay
  636.  
  637.  
  638.  
  639. FUNCTION GetMess
  640. *----------------------------------------------------------------------------
  641. * NAME
  642. *   GetMess() -
  643. * DEPENDENCIES
  644. *   Uses nCurrent to determine the wait state for the given object.
  645. *----------------------------------------------------------------------------
  646.   PRIVATE lRtn
  647.  
  648.   DO CASE
  649.     CASE nCurrent = 5                   && CS_FILE_1
  650.       ON KEY LABEL F1 DO DlgHlpHd
  651.       DO GetEdit
  652.       ON KEY LABEL F1
  653.     CASE nCurrent = 7                   && CL_TYPE_1
  654.       DO GetDDL
  655.     CASE nCurrent = 15                  && CK_READ_1
  656.       DO GetWait
  657.     CASE nCurrent = 19                  && BT_DEMO
  658.       DO TButton WITH WM_PAINT, BN_UNHILITE, 20
  659.       BT_DEMO = .F.
  660.       DO GetWait
  661.     CASE nCurrent = 20                  && BT_OK
  662.       DO GetWait
  663.     CASE nCurrent = 21                  && BT_CANCEL
  664.       DO TButton WITH WM_PAINT, BN_UNHILITE, 20
  665.       BT_CANCEL = .F.
  666.       DO GetWait
  667.   ENDCASE
  668.  
  669.   IF nMess = KB_F1
  670.     DO _HelpSys WITH cDialog, ;
  671.        LEFT( TRANSFORM( aObjPoint[ nCurrent ], "@L 99" ) + ;
  672.              aClkObj[ aObjPoint[ nCurrent ], 11 ], 10 ), ;
  673.        cHelpFile
  674.   ENDIF
  675.  
  676.   IF nMess = KB_ESC
  677.     lRtn = .T.
  678.   ELSE
  679.     lRtn = .F.
  680.   ENDIF
  681.  
  682. RETURN lRtn
  683. *-- EOF: GetMess(  )
  684.  
  685. PROCEDURE DlgHlpHd
  686. *----------------------------------------------------------------------------
  687. * NAME
  688. *   DlgHlpHd - 
  689. *
  690. * DESCRIPTION
  691. *
  692. *----------------------------------------------------------------------------
  693.     DO _HelpSys WITH cDialog, ;
  694.        LEFT( TRANSFORM( aObjPoint[ nCurrent ], "@L 99" ) + ;
  695.              aClkObj[ aObjPoint[ nCurrent ], 11 ], 10 ), ;
  696.        cHelpFile
  697.     nMess = 0
  698.  
  699. RETURN
  700. *-- EOP: DlgHlpHd
  701.  
  702.  
  703. PROCEDURE GetWait
  704. *----------------------------------------------------------------------------
  705. * NAME
  706. *   GetWait -
  707. *
  708. * DESCRIPTION
  709. *
  710. *----------------------------------------------------------------------------
  711.   nMess = 0
  712.   nAccel = 0
  713.  
  714.   lButtAct = .T.
  715.   DO TButton WITH WM_PAINT, BN_HILITE, nCurrent
  716.  
  717.   SET CONSOLE OFF
  718.   SET CURSOR OFF
  719.   WAIT
  720.   SET CONSOLE ON
  721.  
  722.   nMess = LASTKEY()
  723.   nMRow = MROW()
  724.   nMCol = MCOL()
  725.  
  726. RETURN
  727. *-- EOP: GetWait
  728.  
  729.  
  730. PROCEDURE TButton
  731. PARAMETERS pn_msg, pc_data, pnObject
  732. *----------------------------------------------------------------------------
  733. * NAME
  734. *   TButton -
  735. *
  736. * DESCRIPTION
  737. *
  738. * PARAMETERS
  739. *   pn_msg     =
  740. *   pc_data    =
  741. *   pnObject   =
  742. *
  743. *----------------------------------------------------------------------------
  744.   DO CASE
  745.     CASE pnObject = 15                  && CK_READ_1
  746.       DO CASE
  747.         CASE pn_msg = WM_PAINT
  748.           DO CASE
  749.             CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  750.               @ 12, 27 SAY "[ ] Read-only " COLOR n/gb
  751.               @ 12, 28 SAY IIF( CK_READ_1 , "X"," " ) COLOR n/gb
  752.             CASE pc_data = BN_HILITE
  753.               @ 12, 27 SAY "[ ] Read-only " COLOR w+/gb
  754.               @ 12, 28 SAY IIF( CK_READ_1 , "X"," " ) COLOR w+/gb
  755.             CASE pc_data = BN_DISABLE
  756.               @ 12, 27 SAY "[ ] Read-only " COLOR n+/gb
  757.               @ 12, 28 SAY IIF( CK_READ_1 , "X"," " ) COLOR n+/gb
  758.           ENDCASE
  759.           IF pc_data <> BN_DISABLE
  760.             @ 12, 31 SAY "R" COLOR gr+/gb
  761.           ENDIF
  762.         CASE pn_msg = BN_CLICKED
  763.           IF CK_READ_1
  764.             STORE .F. TO CK_READ_1
  765.           ELSE
  766.             STORE .T. TO CK_READ_1
  767.           ENDIF
  768.  
  769.           DO TButton WITH WM_PAINT, BN_HILITE, 15
  770.       ENDCASE
  771.     CASE pnObject = 19                  && BT_DEMO
  772.       DO CASE
  773.         CASE pn_msg = WM_PAINT
  774.           DO CASE
  775.             CASE pc_data = BN_PAINT
  776.               @ 15, 19 SAY " Demo dialog " COLOR n/g
  777.             CASE pc_data = BN_HILITE
  778.               @ 15, 19 SAY " Demo dialog " COLOR w+/g
  779.             CASE pc_data = BN_UNHILITE
  780.               @ 15, 19 SAY " Demo dialog " COLOR n/g
  781.             CASE pc_data = BN_DEFAULT
  782.               @ 15, 19 SAY " Demo dialog " COLOR bg+/g
  783.             CASE pc_data = BN_DISABLE
  784.               @ 15, 19 SAY " Demo dialog " COLOR n+/g
  785.             CASE pc_data = SE_SHADOW
  786.               @ 16, 20 SAY "▀▀▀▀▀▀▀▀▀▀▀▀▀" COLOR n/w
  787.               @ 15, 32 SAY "▄" COLOR n/w
  788.             CASE pc_data = BN_PRESSED
  789.               @ 16, 20 SAY SPACE( 13 ) COLOR n/w
  790.               @ 15, 19 SAY " " COLOR n/w
  791.               @ 15, 32 SAY " " COLOR n/w
  792.               @ 15, 20 SAY " Demo dialog " COLOR w+/g
  793.           ENDCASE
  794.           IF pc_data <> BN_PRESSED .AND. pc_data <> BN_DISABLE
  795.             @ 15, 20 SAY "D" COLOR gr+/g
  796.           ENDIF
  797.         CASE pn_msg = BN_CLICKED
  798.           DO TButton WITH WM_PAINT, BN_PRESSED, 19
  799.  
  800.           *---------------------------------------
  801.           *-- Do the program contained in DO() UDF
  802.           *---------------------------------------
  803.           DO tvdial
  804.  
  805.           DO TButton WITH WM_PAINT, BN_PAINT, 19
  806.           DO TButton WITH WM_PAINT, SE_SHADOW, 19
  807.       ENDCASE
  808.  
  809.     CASE pnObject = 20                  && BT_OK
  810.       DO CASE
  811.         CASE pn_msg = WM_PAINT
  812.           DO CASE
  813.             CASE pc_data = BN_PAINT
  814.               @ 15, 36 SAY "   Ok   " COLOR bg+/g
  815.             CASE pc_data = BN_HILITE
  816.               @ 15, 36 SAY "   Ok   " COLOR w+/g
  817.             CASE pc_data = BN_UNHILITE
  818.               @ 15, 36 SAY "   Ok   " COLOR n/g
  819.             CASE pc_data = BN_DEFAULT
  820.               @ 15, 36 SAY "   Ok   " COLOR bg+/g
  821.             CASE pc_data = BN_DISABLE
  822.               @ 15, 36 SAY "   Ok   " COLOR n+/g
  823.             CASE pc_data = SE_SHADOW
  824.               @ 16, 37 SAY "▀▀▀▀▀▀▀▀" COLOR n/w
  825.               @ 15, 44 SAY "▄" COLOR n/w
  826.             CASE pc_data = BN_PRESSED
  827.               @ 16, 37 SAY SPACE( 8 ) COLOR n/w
  828.               @ 15, 36 SAY " " COLOR n/w
  829.               @ 15, 44 SAY " " COLOR n/w
  830.               @ 15, 37 SAY "   Ok   " COLOR w+/g
  831.           ENDCASE
  832.         CASE pn_msg = BN_CLICKED
  833.           DO TButton WITH WM_PAINT, BN_PRESSED, 20
  834.           IF OpenFiVl( "BT_OK" )
  835.             nMess = DLN_OK
  836.           ENDIF
  837.           x = INKEY( .2 )
  838.           DO TButton WITH WM_PAINT, BN_PAINT, 20
  839.           DO TButton WITH WM_PAINT, SE_SHADOW, 20
  840.       ENDCASE
  841.  
  842.     CASE pnObject = 21                  && BT_CANCEL
  843.       DO CASE
  844.         CASE pn_msg = WM_PAINT
  845.           DO CASE
  846.             CASE pc_data = BN_PAINT
  847.               @ 15, 49 SAY " Cancel " COLOR n/g
  848.             CASE pc_data = BN_HILITE
  849.               @ 15, 49 SAY " Cancel " COLOR w+/g
  850.             CASE pc_data = BN_UNHILITE
  851.               @ 15, 49 SAY " Cancel " COLOR n/g
  852.             CASE pc_data = BN_DEFAULT
  853.               @ 15, 49 SAY " Cancel " COLOR bg+/g
  854.             CASE pc_data = BN_DISABLE
  855.               @ 15, 49 SAY " Cancel " COLOR n+/g
  856.             CASE pc_data = SE_SHADOW
  857.               @ 16, 50 SAY "▀▀▀▀▀▀▀▀" COLOR n/w
  858.               @ 15, 57 SAY "▄" COLOR n/w
  859.             CASE pc_data = BN_PRESSED
  860.               @ 16, 50 SAY SPACE( 8 ) COLOR n/w
  861.               @ 15, 49 SAY " " COLOR n/w
  862.               @ 15, 57 SAY " " COLOR n/w
  863.               @ 15, 50 SAY " Cancel " COLOR w+/g
  864.           ENDCASE
  865.         CASE pn_msg = BN_CLICKED
  866.           DO TButton WITH WM_PAINT, BN_PRESSED, 21
  867.           x = INKEY( .2 )
  868.           nMess = DLN_CANCEL
  869.           DO TButton WITH WM_PAINT, BN_PAINT, 21
  870.           DO TButton WITH WM_PAINT, SE_SHADOW, 21
  871.       ENDCASE
  872.  
  873.   ENDCASE
  874.  
  875. RETURN
  876. *-- EOP: TButton WITH pn_msg, pc_data, pnObject
  877.  
  878.  
  879. PROCEDURE GetEdit
  880. *----------------------------------------------------------------------------
  881. * NAME
  882. *   GetEdit -
  883. *
  884. * DESCRIPTION
  885. *
  886. *----------------------------------------------------------------------------
  887.   PRIVATE lSkipRead
  888.   lSkipRead = .F.
  889.   nMess = 0
  890.   nAccel = 0
  891.  
  892.   nMsEvent = 0
  893.   ON MOUSE DO MsHand WITH MROW(), MCOL()
  894.   DO SetOnKey
  895.  
  896.   DO CASE
  897.     CASE nCurrent = 5
  898.       @ 3, 2 GET CS_FILE_1 PICTURE '@S15'
  899.       IF aClkBox[ 1 ,6 ]
  900.         lSkipRead = .T.
  901.         aClkBox[ 1 ,6 ] = .F.
  902.       ENDIF
  903.   ENDCASE
  904.  
  905.   IF .NOT. lSkipRead
  906.     SET CURSOR ON
  907.     READ
  908.     SET CURSOR OFF
  909.   ENDIF
  910.  
  911.   DO ClrOnKey
  912.   ON MOUSE
  913.  
  914.   IF .NOT. lSkipRead
  915.     IF nMsEvent = KB_MOUSE
  916.       nMess = KB_MOUSE
  917.     ELSE
  918.       nMess = LASTKEY()
  919.     ENDIF
  920.   ELSE
  921.     nMess = KB_DOWNARROW
  922.   ENDIF
  923.  
  924. RETURN
  925. *-- EOP: GetEdit
  926.  
  927.  
  928. PROCEDURE TEdit
  929. PARAMETERS pn_msg, p__data, pnObject
  930. *----------------------------------------------------------------------------
  931. * NAME
  932. *   TEdit -
  933. *
  934. * DESCRIPTION
  935. *
  936. * PARAMETERS
  937. *   pn_msg     =
  938. *   p__data    =
  939. *   pnObject   =
  940. *
  941. *----------------------------------------------------------------------------
  942.   DO CASE
  943.     CASE pnObject = 5                    && CS_FILE_1
  944.       DO CASE
  945.         CASE p__data = EN_KILLFOC
  946.           @ 3, 2 GET CS_FILE_1 PICTURE '@S80 XXXXXXXXXXXXXXX'
  947.           CLEAR GETS
  948.       ENDCASE
  949.  
  950.  
  951.   ENDCASE
  952.  
  953. RETURN
  954. *-- EOP: TEdit WITH pn_msg, p__data, pnObject
  955.  
  956.  
  957. PROCEDURE TList
  958. PARAMETERS pn_msg, p__data, pnObject
  959. *----------------------------------------------------------------------------
  960. * NAME
  961. *   TList -
  962. *
  963. * DESCRIPTION
  964. *
  965. * PARAMETERS
  966. *   pn_msg     =
  967. *   p__data    =
  968. *   pnObject   =
  969. *
  970. *----------------------------------------------------------------------------
  971.   IF TYPE( "cPopDef" ) <> "C"
  972.     cPopDef = ""
  973.   ENDIF
  974.  
  975.   DO CASE
  976.     CASE pnObject = 5
  977.       DO CASE
  978.         CASE pn_msg = WM_PAINT
  979.           DO CASE
  980.             CASE p__data = LBN_KILLFO
  981.               DO HasTitle WITH nCurrent, BN_UNHILITE
  982.             CASE p__data = WM_DRAWITEM
  983.               SET COLOR OF MESS TO n/gb
  984.               SET COLOR OF TITLE TO n/gb
  985.               IF ISBLANK( CS_FILE_1 )
  986.                 DEFINE POPUP Cs_file_1 FROM  4,  3 TO 14, 16 PROMPT FILES LIKE *.*
  987.               ELSE
  988.                 DEFINE POPUP Cs_file_1 FROM  4,  3 TO 14, 16 PROMPT FILES LIKE &CS_FILE_1
  989.               ENDIF
  990.               SHOW POPUP CS_FILE_1
  991.           ENDCASE
  992.         CASE pn_msg = LBN_SETFOC
  993.           SET COLOR OF MESS TO n/gb
  994.           SET COLOR OF TITLE TO n/gb
  995.           nMsEvent = 0
  996.           nMess = 0
  997.           nAccel = 0                    && dBRIEF Tag...
  998.           pl_IsPop = .T.
  999.  
  1000.           ON MOUSE DO MsHand WITH MROW(), MCOL(), .T.
  1001.           DO SetOnKey
  1002.           ON KEY LABEL Tab DO TabOut WITH KB_TAB
  1003.           ON KEY LABEL BackTab DO TabOut WITH KB_SHIFTTAB
  1004.  
  1005.           lOk = .T.
  1006.           ON ERROR lOk = .F.
  1007.           ON POPUP CS_FILE_1 DO TList WITH LBN_SELCHA, .F., nCurrent
  1008.           ON ERROR
  1009.           IF .NOT. lOk
  1010.             DO TList WITH WM_PAINT, WM_DRAWITEM, nCurrent
  1011.             ON POPUP CS_FILE_1 DO TList WITH LBN_SELCHA, .F., nCurrent
  1012.           ENDIF
  1013.           ON SELECTION POPUP CS_FILE_1 DO TList WITH LBN_DBLCLK, .F., nCurrent
  1014.  
  1015.           *---------------------------------------------
  1016.           *-- Keyboard to position bar at last selection
  1017.           *---------------------------------------------
  1018.           IF .NOT. ISBLANK( CATALOG() )
  1019.             n = nCS_FILE - 2
  1020.           ELSE
  1021.             IF nCS_FILE = 3
  1022.               n = 0
  1023.             ELSE
  1024.               n =  nCS_FILE - 3
  1025.             ENDIF
  1026.           ENDIF
  1027.           IF n > 0
  1028.             i = 1
  1029.             DO WHILE i < n
  1030.               KEYBOARD [{DnArrow}]
  1031.               i = i + 1
  1032.             ENDDO
  1033.           ENDIF
  1034.  
  1035.           ACTIVATE POPUP CS_FILE_1
  1036.           ON KEY LABEL Tab
  1037.           ON KEY LABEL BackTab
  1038.           DO ClrOnKey
  1039.           ON MOUSE
  1040.  
  1041.           pl_IsPop = .F.
  1042.  
  1043.           IF BAR() > 0
  1044.             IF nMess <> DLN_OK
  1045.               nMess = KB_ENTER
  1046.             ENDIF
  1047.             ON ERROR lOk = .F.
  1048.             RESTORE SCREEN FROM CS_FILE_1
  1049.             RELEASE SCREEN CS_FILE_1
  1050.             ON ERROR
  1051.           ELSE
  1052.             IF nMess = 0
  1053.               IF nMsEvent = KB_MOUSE
  1054.                 nMess = KB_MOUSE
  1055.                 RESTORE SCREEN FROM CS_FILE_1
  1056.                 RELEASE SCREEN CS_FILE_1
  1057.               ELSE
  1058.                 nMess = LASTKEY()
  1059.               ENDIF
  1060.             ELSE
  1061.               ON ERROR lOk = .F.
  1062.               RESTORE SCREEN FROM CS_FILE_1
  1063.               RELEASE SCREEN CS_FILE_1
  1064.               ON ERROR
  1065.             ENDIF
  1066.           ENDIF
  1067.         CASE pn_msg = LBN_SELCHA
  1068.           *-- ON POPUP Handler here
  1069.           IF pnObject = 5
  1070.             IF OpenFiVl( "CS_FILE_1" )
  1071.             ENDIF
  1072.           ENDIF
  1073.  
  1074.         CASE pn_msg = LBN_DBLCLK
  1075.           SAVE SCREEN TO CS_FILE_1
  1076.           STORE BAR() TO nCS_FILE
  1077.           IF pnObject = 5
  1078.             IF OpenFiVl( "CS_FILE_1" )
  1079.             ENDIF
  1080.           ENDIF
  1081.  
  1082.           DEACTIVATE POPUP
  1083.       ENDCASE
  1084.     CASE pnObject = 7
  1085.       DO CASE
  1086.         CASE pn_msg = WM_PAINT
  1087.           DO CASE
  1088.             CASE p__data = LBN_KILLFO
  1089.               DO HasTitle WITH nCurrent, BN_UNHILITE
  1090.             CASE p__data = WM_DRAWITEM
  1091.               SET COLOR OF MESS TO n/gb
  1092.               SET COLOR OF TITLE TO n/gb
  1093.               *--------------------------------------------------
  1094.               *-- Build the popup based on a comma delimited list
  1095.               *--------------------------------------------------
  1096.               DEFINE POPUP Cl_type_1 FROM  4, 21 TO 10, 49
  1097.                 DEFINE BAR 1 OF CL_TYPE_1 PROMPT "Screen files (*.scr)"
  1098.                 DEFINE BAR 2 OF CL_TYPE_1 PROMPT "Database files (*.dbf)"
  1099.                 DEFINE BAR 3 OF CL_TYPE_1 PROMPT "Program files (*.prg)"
  1100.                 DEFINE BAR 4 OF CL_TYPE_1 PROMPT "Compiled files(*.dbo)"
  1101.                 DEFINE BAR 5 OF CL_TYPE_1 PROMPT "All Files (*.*)"
  1102.               SHOW POPUP CL_TYPE_1
  1103.           ENDCASE
  1104.         CASE pn_msg = LBN_SETFOC
  1105.           SET COLOR OF MESS TO n/gb
  1106.           SET COLOR OF TITLE TO n/gb
  1107.           nMsEvent = 0
  1108.           nMess = 0
  1109.           nAccel = 0                    && dBRIEF Tag...
  1110.           pl_IsPop = .T.
  1111.  
  1112.           ON MOUSE DO MsHand WITH MROW(), MCOL(), .T.
  1113.           DO SetOnKey
  1114.           ON KEY LABEL Tab DO TabOut WITH KB_TAB
  1115.           ON KEY LABEL BackTab DO TabOut WITH KB_SHIFTTAB
  1116.  
  1117.           lOk = .T.
  1118.           ON ERROR lOk = .F.
  1119.           ON POPUP CL_TYPE_1 DO TList WITH LBN_SELCHA, .F., nCurrent
  1120.           ON ERROR
  1121.           IF .NOT. lOk
  1122.             DO TList WITH WM_PAINT, WM_DRAWITEM, nCurrent
  1123.             ON POPUP CL_TYPE_1 DO TList WITH LBN_SELCHA, .F., nCurrent
  1124.           ENDIF
  1125.           ON SELECTION POPUP CL_TYPE_1 DO TList WITH LBN_DBLCLK, .F., nCurrent
  1126.  
  1127.           *---------------------------------------------
  1128.           *-- Keyboard to position bar at last selection
  1129.           *---------------------------------------------
  1130.           n = nCL_TYPE
  1131.           IF n > 0
  1132.             i = 1
  1133.             DO WHILE i < n
  1134.               KEYBOARD [{DnArrow}]
  1135.               i = i + 1
  1136.             ENDDO
  1137.           ENDIF
  1138.  
  1139.           ACTIVATE POPUP CL_TYPE_1
  1140.           ON KEY LABEL Tab
  1141.           ON KEY LABEL BackTab
  1142.           DO ClrOnKey
  1143.           ON MOUSE
  1144.  
  1145.           pl_IsPop = .F.
  1146.  
  1147.           IF BAR() > 0
  1148.             IF nMess <> DLN_OK
  1149.               nMess = KB_ENTER
  1150.             ENDIF
  1151.             ON ERROR lOk = .F.
  1152.             RESTORE SCREEN FROM CL_TYPE_1
  1153.             RELEASE SCREEN CL_TYPE_1
  1154.             ON ERROR
  1155.           ELSE
  1156.             IF nMess = 0
  1157.               IF nMsEvent = KB_MOUSE
  1158.                 nMess = KB_MOUSE
  1159.                 RESTORE SCREEN FROM CL_TYPE_1
  1160.                 RELEASE SCREEN CL_TYPE_1
  1161.               ELSE
  1162.                 nMess = LASTKEY()
  1163.               ENDIF
  1164.             ELSE
  1165.               ON ERROR lOk = .F.
  1166.               RESTORE SCREEN FROM CL_TYPE_1
  1167.               RELEASE SCREEN CL_TYPE_1
  1168.               ON ERROR
  1169.             ENDIF
  1170.           ENDIF
  1171.         CASE pn_msg = LBN_SELCHA
  1172.           *-- ON POPUP Handler here
  1173.           IF pnObject = 7
  1174.             IF OpenFiVl( "CL_TYPE_1" )
  1175.             ENDIF
  1176.           ENDIF
  1177.  
  1178.         CASE pn_msg = LBN_DBLCLK
  1179.           SAVE SCREEN TO CL_TYPE_1
  1180.           STORE BAR() TO nCL_TYPE
  1181.           IF pnObject = 7
  1182.             IF OpenFiVl( "CL_TYPE_1" )
  1183.             ENDIF
  1184.           ENDIF
  1185.  
  1186.           DEACTIVATE POPUP
  1187.       ENDCASE
  1188.  
  1189.   ENDCASE
  1190.  
  1191. RETURN
  1192. *-- EOP: TList WITH pn_msg, p__data, pnObject
  1193.  
  1194. PROCEDURE TabOut
  1195. PARAMETERS pn_Key
  1196. *----------------------------------------------------------------------------
  1197. * NAME
  1198. *   TabOut -
  1199. *
  1200. * DESCRIPTION
  1201. *
  1202. * PARAMETERS
  1203. *   pn_Key     =
  1204. *
  1205. *----------------------------------------------------------------------------
  1206.   PRIVATE nRow, nCol, cPath, cPrompt, cDrive
  1207.   nRow = ROW()
  1208.   nCol = COL()
  1209.  
  1210.   DO CASE
  1211.     CASE nCurrent = 5
  1212.       STORE BAR() TO nCS_FILE
  1213.       *-- Redisplay the bar because of a "feature" in dBASE
  1214.       cPrompt = TRIM( PROMPT() )
  1215.       cDrive = _FileDrv( cPrompt )
  1216.       IF .NOT. ISBLANK( cDrive )
  1217.         cPath = cDrive + ":" + _FilePath( cPrompt )
  1218.       ELSE
  1219.         cPath = _FilePath( cPrompt )
  1220.       ENDIF
  1221.       cPrompt = TRIM( SUBSTR( cPrompt, LEN( cPath )+1 ) )
  1222.       cPrompt = LEFT( cPrompt + SPACE( 12 ), 12 )
  1223.       @ nRow, nCol SAY cPrompt COLOR w+/g
  1224.       SAVE SCREEN TO CS_FILE_1
  1225.       nMess = pn_Key
  1226.       KEYBOARD "{LeftArrow}"
  1227.     CASE nCurrent = 7
  1228.       STORE BAR() TO nCL_TYPE
  1229.       *-- Redisplay the bar because of a "feature" in dBASE
  1230.       cPrompt = TRIM( PROMPT() )
  1231.       cPrompt = LEFT( cPrompt + SPACE( 27 ), 27 )
  1232.       @ nRow, nCol SAY cPrompt COLOR w+/g
  1233.       SAVE SCREEN TO CL_TYPE_1
  1234.       nMess = pn_Key
  1235.       KEYBOARD "{LeftArrow}"
  1236.   ENDCASE
  1237.  
  1238. RETURN
  1239. *-- EOP: TabOut WITH pn_Key
  1240.  
  1241.  
  1242. PROCEDURE TCombo
  1243. PARAMETERS pn_msg, p__data, pnObject
  1244. *----------------------------------------------------------------------------
  1245. * NAME
  1246. *   TCombo -
  1247. *
  1248. * DESCRIPTION
  1249. *
  1250. * PARAMETERS
  1251. *   pn_msg     =
  1252. *   p__data    =
  1253. *   pnObject   =
  1254. *
  1255. *----------------------------------------------------------------------------
  1256.   PRIVATE cDisplay
  1257.   DO CASE
  1258.     CASE pnObject = 5
  1259.       DO CASE
  1260.         CASE pn_msg = WM_PAINT
  1261.           DO CASE
  1262.             CASE p__data = CBN_KILLFOC
  1263.               DO HasTitle WITH pnObject, BN_UNHILITE
  1264.             CASE p__data = CB_HIDELST
  1265.               @ 3, 2 GET CS_FILE_1 PICTURE 'XXXXXXXXXXXXXXX'
  1266.               CLEAR GETS
  1267.             CASE p__data = CB_SHOWDRO
  1268.               DO TList WITH WM_PAINT, WM_DRAWITEM, pnObject
  1269.           ENDCASE
  1270.         CASE pn_msg = CBN_DROPDOW
  1271.           SAVE SCREEN TO Tcombo
  1272.           DO TCombo WITH WM_PAINT, CB_SHOWDRO, pnObject
  1273.           DO TCombo WITH CBN_INLIST, .F., pnObject
  1274.           DO TCombo WITH WM_PAINT, CB_HIDELST, pnObject
  1275.           RESTORE SCREEN FROM Tcombo
  1276.           RELEASE SCREEN Tcombo
  1277.           @ 3, 2 GET CS_FILE_1 PICTURE 'XXXXXXXXXXXXXXX'
  1278.           CLEAR GETS
  1279.         CASE pn_msg = CB_SELECTS
  1280.           *-----------------------------------------------------
  1281.           *-- Do not repaint the get area during scroll re-entry
  1282.           *-----------------------------------------------------
  1283.           IF nCs_file > 0
  1284.             IF BAR() <> nCs_file
  1285.               RETURN
  1286.             ELSE
  1287.               nCs_file = 0
  1288.             ENDIF
  1289.           ENDIF
  1290.  
  1291.           IF TYPE( "p__data" ) = "L"
  1292.             cPrompt = PROMPT()
  1293.           ELSE
  1294.             cPrompt = p__data
  1295.           ENDIF
  1296.           cFileRoot = _FileRoot( cPrompt )
  1297.           IF .NOT. "<" $ cFileRoot
  1298.             STORE cFileRoot + "." + _FileType( cPrompt ) TO cDisplay
  1299.             STORE LEFT( cPrompt + SPACE( 80 ), 80 ) TO CS_FILE_1
  1300.             STORE LEFT( cDisplay + SPACE( 80 ), 80 ) TO cDisplay
  1301.             @ 3 , 2 GET cDisplay PICTURE 'XXXXXXXXXXXXXXX'
  1302.             CLEAR GETS
  1303.           ENDIF
  1304.         CASE pn_msg = CBN_INLIST
  1305.           SET COLOR OF MESS TO n/gb
  1306.           SET COLOR OF TITLE TO n/gb
  1307.           nMsEvent = 0
  1308.           nMess = 0
  1309.           nAccel = 0
  1310.           pl_IsPop = .T.
  1311.           ON MOUSE DO MsHand WITH MROW(), MCOL(), .T.
  1312.           DO SetOnKey
  1313.           ON KEY LABEL Tab DO TabOut WITH KB_TAB
  1314.           ON KEY LABEL BackTab DO TabOut WITH KB_SHIFTTAB
  1315.           ON POPUP CS_FILE_1 DO TCombo WITH CB_SELECTS, .F., pnObject
  1316.           ON SELECTION POPUP CS_FILE_1 DO TComboSel
  1317.  
  1318.           *-------------------------------------------------
  1319.           *-- Keyboard in down arrows to match prompt string
  1320.           *-------------------------------------------------
  1321.           IF nCs_file > 0
  1322.             n = 1
  1323.             nHowMany = nCs_file - 1
  1324.             IF ISBLANK( CATALOG() ) 
  1325.               nHowMany = nHowMany - 3
  1326.             ELSE
  1327.               nHowMany = nHowMany - 2
  1328.             ENDIF
  1329.             DO WHILE n <= nHowMany
  1330.               KEYBOARD [{DnArrow}]
  1331.               n = n + 1
  1332.             ENDDO
  1333.           ENDIF
  1334.  
  1335.           ACTIVATE POPUP CS_FILE_1
  1336.  
  1337.           pl_IsPop = .F.
  1338.           ON KEY LABEL Tab
  1339.           ON KEY LABEL BackTab
  1340.           DO ClrOnKey
  1341.           ON MOUSE
  1342.  
  1343.           IF BAR() > 0
  1344.             SHOW POPUP CS_FILE_1
  1345.             nMess = KB_ENTER
  1346.             nCs_file = BAR()
  1347.           ELSE
  1348.             IF nMess = 0
  1349.               IF nMsEvent = KB_MOUSE
  1350.                 nMess = KB_MOUSE
  1351.                 RESTORE SCREEN FROM CS_FILE_1
  1352.                 RELEASE SCREEN CS_FILE_1
  1353.               ELSE
  1354.                 nMess = LASTKEY()
  1355.               ENDIF
  1356.             ELSE
  1357.               RESTORE SCREEN FROM CS_FILE_1
  1358.               RELEASE SCREEN CS_FILE_1
  1359.             ENDIF
  1360.           ENDIF
  1361.       ENDCASE
  1362.     CASE pnObject = 7
  1363.       DO CASE
  1364.         CASE pn_msg = WM_PAINT
  1365.           DO CASE
  1366.             CASE p__data = CBN_KILLFOC
  1367.               DO HasTitle WITH pnObject, BN_UNHILITE
  1368.             CASE p__data = CB_HIDELST
  1369.               @ 3, 20 GET CL_TYPE_1 PICTURE 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  1370.               @ 3, 49 SAY CHR(222) COLOR g/w
  1371.               @ 3, 50 SAY CHR(25) COLOR n/g
  1372.               @ 3, 51 SAY CHR(221) COLOR g/w
  1373.               CLEAR GETS
  1374.             CASE p__data = CB_SHOWDRO
  1375.               DO TList WITH WM_PAINT, WM_DRAWITEM, pnObject
  1376.           ENDCASE
  1377.         CASE pn_msg = CBN_DROPDOW
  1378.           SAVE SCREEN TO Tcombo
  1379.           DO TCombo WITH WM_PAINT, CB_SHOWDRO, pnObject
  1380.           DO TCombo WITH CBN_INLIST, .F., pnObject
  1381.           DO TCombo WITH WM_PAINT, CB_HIDELST, pnObject
  1382.           RESTORE SCREEN FROM Tcombo
  1383.           RELEASE SCREEN Tcombo
  1384.           @ 3, 20 GET CL_TYPE_1 PICTURE 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  1385.           CLEAR GETS
  1386.         CASE pn_msg = CB_SELECTS
  1387.           *-----------------------------------------------------
  1388.           *-- Do not repaint the get area during scroll re-entry
  1389.           *-----------------------------------------------------
  1390.           IF nCl_type > 0
  1391.             IF BAR() <> nCl_type
  1392.               RETURN
  1393.             ELSE
  1394.               nCl_type = 0
  1395.             ENDIF
  1396.           ENDIF
  1397.  
  1398.           IF TYPE( "p__data" ) = "L"
  1399.             cPrompt = PROMPT()
  1400.           ELSE
  1401.             cPrompt = p__data
  1402.           ENDIF
  1403.           STORE cPrompt TO CL_TYPE_1
  1404.           STORE LEFT( CL_TYPE_1 + SPACE( 33 ), 33 ) TO CL_TYPE_1
  1405.           @ 3 , 20 GET CL_TYPE_1 PICTURE 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  1406.           CLEAR GETS
  1407.         CASE pn_msg = CBN_INLIST
  1408.           SET COLOR OF MESS TO n/gb
  1409.           SET COLOR OF TITLE TO n/gb
  1410.           nMsEvent = 0
  1411.           nMess = 0
  1412.           nAccel = 0
  1413.           pl_IsPop = .T.
  1414.           ON MOUSE DO MsHand WITH MROW(), MCOL(), .T.
  1415.           DO SetOnKey
  1416.           ON KEY LABEL Tab DO TabOut WITH KB_TAB
  1417.           ON KEY LABEL BackTab DO TabOut WITH KB_SHIFTTAB
  1418.           ON POPUP CL_TYPE_1 DO TCombo WITH CB_SELECTS, .F., pnObject
  1419.           ON SELECTION POPUP CL_TYPE_1 DO TComboSel
  1420.  
  1421.           *-------------------------------------------------
  1422.           *-- Keyboard in down arrows to match prompt string
  1423.           *-------------------------------------------------
  1424.           IF nCl_type > 0
  1425.             n = 1
  1426.             nHowMany = nCl_type - 1
  1427.             DO WHILE n <= nHowMany
  1428.               KEYBOARD [{DnArrow}]
  1429.               n = n + 1
  1430.             ENDDO
  1431.           ENDIF
  1432.  
  1433.           ACTIVATE POPUP CL_TYPE_1
  1434.  
  1435.           pl_IsPop = .F.
  1436.           ON KEY LABEL Tab
  1437.           ON KEY LABEL BackTab
  1438.           DO ClrOnKey
  1439.           ON MOUSE
  1440.  
  1441.           IF BAR() > 0
  1442.             nMess = KB_ENTER
  1443.             nCl_type = BAR()
  1444.           ELSE
  1445.             IF nMess = 0
  1446.               IF nMsEvent = KB_MOUSE
  1447.                 nMess = KB_MOUSE
  1448.                 RESTORE SCREEN FROM CL_TYPE_1
  1449.                 RELEASE SCREEN CL_TYPE_1
  1450.               ELSE
  1451.                 nMess = LASTKEY()
  1452.               ENDIF
  1453.             ELSE
  1454.               RESTORE SCREEN FROM CL_TYPE_1
  1455.               RELEASE SCREEN CL_TYPE_1
  1456.             ENDIF
  1457.           ENDIF
  1458.       ENDCASE
  1459.  
  1460.   ENDCASE
  1461.  
  1462. RETURN
  1463. *-- EOP: TCombo WITH pn_msg, p__data, pnObject
  1464.  
  1465. PROCEDURE TComboSel
  1466. *----------------------------------------------------------------------------
  1467. * NAME
  1468. *   TComboSel -
  1469. *
  1470. * DESCRIPTION
  1471. *
  1472. *----------------------------------------------------------------------------
  1473.  
  1474.   DO TCombo WITH CB_SELECTS, .F., pnObject
  1475.   DEACTIVATE POPUP
  1476.  
  1477. RETURN
  1478. *-- EOP: TComboSel
  1479.  
  1480.  
  1481. PROCEDURE GetDDL
  1482. *----------------------------------------------------------------------------
  1483. * NAME
  1484. *   GetDDL - Get Combo Box Drop Down List
  1485. *
  1486. * DESCRIPTION
  1487. *
  1488. *----------------------------------------------------------------------------
  1489.  
  1490.   lShowDrop = ( nAccel > 0 .OR. nMess = KB_MOUSE ) .AND. nMess <> KB_ENTER
  1491.  
  1492.   DO CASE
  1493.     CASE nCurrent = 7                    && CL_TYPE_1
  1494.       *-------------------------------------------------
  1495.       *-- Look to see if the object in focus has a title
  1496.       *-------------------------------------------------
  1497.       DO HasTitle WITH nCurrent, BN_HILITE
  1498.       @ 3, 20 GET CL_TYPE_1 PICTURE 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  1499.       @ 3, 49 SAY CHR(222) COLOR g/w
  1500.       @ 3, 50 SAY CHR(25) COLOR n/g
  1501.       @ 3, 51 SAY CHR(221) COLOR g/w
  1502.       CLEAR GETS
  1503.  
  1504.   ENDCASE
  1505.  
  1506.   IF lShowDrop
  1507.     nMess = KB_SPACE
  1508.   ELSE
  1509.     SET CONSOLE OFF
  1510.     SET CURSOR OFF
  1511.     WAIT
  1512.     SET CONSOLE ON
  1513.     nMess = LASTKEY()
  1514.     nMRow = MROW()
  1515.     nMCol = MCOL()
  1516.   ENDIF
  1517.  
  1518. RETURN
  1519. *-- EOP: GetDDL
  1520.  
  1521. PROCEDURE SetOnKey
  1522. *----------------------------------------------------------------------------
  1523. * NAME
  1524. *   SetOnKey - For each pick key, set on key label
  1525. *
  1526. * DESCRIPTION
  1527. *
  1528. *----------------------------------------------------------------------------
  1529.  
  1530.   ON KEY LABEL Alt-n DO AKeyHand WITH '5'
  1531.   ON KEY LABEL Alt-T DO AKeyHand WITH '7'
  1532.   ON KEY LABEL Alt-R DO AKeyHand WITH '15'
  1533.   ON KEY LABEL Alt-D DO AKeyHand WITH '19'
  1534.  
  1535. RETURN
  1536. *-- EOP: SetOnKey
  1537.  
  1538.  
  1539. PROCEDURE ClrOnKey
  1540. *----------------------------------------------------------------------------
  1541. * NAME
  1542. *   ClrOnKey - For each pick key, clear on label
  1543. *
  1544. * DESCRIPTION
  1545. *
  1546. *----------------------------------------------------------------------------
  1547.  
  1548.   ON KEY LABEL Alt-n
  1549.   ON KEY LABEL Alt-T
  1550.   ON KEY LABEL Alt-R
  1551.   ON KEY LABEL Alt-D
  1552.  
  1553. RETURN
  1554. *-- EOP: ClrOnKey
  1555.  
  1556.  
  1557. PROCEDURE AKeyHand
  1558. PARAMETERS cId
  1559. *----------------------------------------------------------------------------
  1560. * NAME
  1561. *   AKeyHand - On key handler for Accel key from popup or get
  1562. *
  1563. * DESCRIPTION
  1564. *
  1565. * PARAMETERS
  1566. *   nId        =
  1567. *
  1568. *----------------------------------------------------------------------------
  1569.  
  1570.   IF nAccel <> nCurrent
  1571.     nAccel = VAL( cId )
  1572.     IF TYPE( "pl_IsPop" ) = "L" .AND. pl_IsPop
  1573.       DO CASE
  1574.         CASE nCurrent = 5
  1575.           STORE BAR() TO nCS_FILE
  1576.           SAVE SCREEN TO CS_FILE_1
  1577.           KEYBOARD "{LeftArrow}"
  1578.           nMess = KB_ENTER
  1579.         CASE nCurrent = 7
  1580.           STORE BAR() TO nCL_TYPE
  1581.           SAVE SCREEN TO CL_TYPE_1
  1582.           KEYBOARD "{LeftArrow}"
  1583.           nMess = KB_ENTER
  1584.         OTHERWISE
  1585.           KEYBOARD "{Ctrl-W}"
  1586.           nMess = KB_CTRLW
  1587.     ENDCASE
  1588.   ELSE
  1589.     KEYBOARD "{Ctrl-W}"
  1590.     nMess = KB_CTRLW
  1591.   ENDIF
  1592.   ELSE
  1593.     nAccel = 0
  1594.   ENDIF
  1595.  
  1596. RETURN
  1597. *-- EOP: AKeyHand WITH nId
  1598.  
  1599.  
  1600. PROCEDURE CkWaitAc
  1601. *----------------------------------------------------------------------------
  1602. * NAME
  1603. *   CkWaitAc - Look for Accel key from Wait command
  1604. *
  1605. * DESCRIPTION
  1606. *   This routine has high International risk for translations.
  1607. *----------------------------------------------------------------------------
  1608.  
  1609.   IF nMess < 0
  1610.     nAccPress = nMess + 500
  1611.   ELSE
  1612.     IF nMess >= 97 .AND. nMess <= 122
  1613.       nMess = nMess - 32
  1614.     ENDIF
  1615.     nAccPress = nMess
  1616.   ENDIF
  1617.  
  1618.   DO CASE
  1619.     CASE nAccPress = 78                  && n - CS_FILE_0
  1620.       nAccel = 5
  1621.     CASE nAccPress = 84                  && T - CL_TYPE_0
  1622.       nAccel = 7
  1623.     CASE nAccPress = 82                  && R - CK_READ_1
  1624.       nAccel = 15
  1625.     CASE nAccPress = 68                  && D - BT_DEMO
  1626.       nAccel = 19
  1627.     OTHERWISE
  1628.       nAccel = 0
  1629.   ENDCASE
  1630.  
  1631. RETURN
  1632. *-- EOP: CkWaitAc
  1633.  
  1634.  
  1635. FUNCTION GetMsTo
  1636. PARAMETER plChkOnly
  1637. *----------------------------------------------------------------------------
  1638. * NAME
  1639. *   GetMsTo() -
  1640. *
  1641. * DESCRIPTION
  1642. *
  1643. *----------------------------------------------------------------------------
  1644.  
  1645.   *-- Check for a click on the close button
  1646.   IF nMRow = nRowCls .AND. nMCol >= nLColCls .AND. nMCol <= nRColCls
  1647.     nMess = DLN_CANCEL
  1648.     nRtn = 0
  1649.   ELSE
  1650.     IF nMRow = nRowCls .AND. nMCol >= nCol .AND. nMCol <= nRWinCol
  1651.       *---------------------------------------------------------
  1652.       *-- All this to remove the shadow before moving the window
  1653.       *---------------------------------------------------------
  1654.       SAVE WINDOW OPENFILE TO _OPENFILE
  1655.       RELEASE WINDOW OPENFILE
  1656.       RESTORE SCREEN FROM OPENFILE
  1657.       RESTORE WINDOW OPENFILE FROM _OPENFILE
  1658.       ERASE _OPENFILE.win
  1659.       ACTIVATE WINDOW OPENFILE
  1660.  
  1661.       @ 0, 0 TO nHigh - 1, nWidth - 1 COLOR g+/w
  1662.       @ 0, 2 SAY "[ ]" COLOR g+/w
  1663.       @ 0, 3 SAY CHR( 254 ) COLOR g+/w
  1664.       @ 0, 22 SAY " Open file" COLOR g+/w
  1665.  
  1666.       *-------------------------------
  1667.       *-- Start the move window action
  1668.       *-------------------------------
  1669.       nDelX = nMRow
  1670.       nDelY = nMCol
  1671.  
  1672.       SET CONSOLE OFF
  1673.       WAIT
  1674.       SET CONSOLE ON
  1675.  
  1676.       nMRow = MROW()
  1677.       nMCol = MCOL()
  1678.       nDelX = nMRow - nDelX
  1679.       nDelY = nMCol - nDelY
  1680.       lMoveOk = .T.
  1681.       ON ERROR lMoveOk = .F.
  1682.       MOVE WINDOW OPENFILE BY nDelX, nDelY
  1683.       ON ERROR
  1684.       IF lMoveOk
  1685.         nRowCls   = nRowCls + nDelX
  1686.         nCol      = nCol + nDelY
  1687.         nLColCls  = ncol + 2            && Left column for close button
  1688.         nRColCls  = ncol + 4            && End column for close button
  1689.         nRWinCol  = ncol + nWidth - 1   && Rigth column for window
  1690.         nXOffset  = nRowCls - nOrigRow
  1691.         nYOffset  = nCol    - nOrigCol
  1692.       ENDIF
  1693.  
  1694.       *---------------------------------------------------------
  1695.       *-- Display the new shadow for after moving the dialog box
  1696.       *---------------------------------------------------------
  1697.       SAVE WINDOW OPENFILE TO _OPENFILE
  1698.       RELEASE WINDOW OPENFILE
  1699.       RESTORE SCREEN FROM OPENFILE
  1700.       ACTIVATE SCREEN
  1701.       IF nCol + 60 < 80 .AND. nRowCls + 18 <= nScreen
  1702.         @ nRowCls + 1, nCol + 1 FILL TO nRowCls + 18, nCol + 60 COLOR n+/n
  1703.       ENDIF
  1704.       RESTORE WINDOW OPENFILE FROM _OPENFILE
  1705.       ERASE _OPENFILE.win
  1706.       ACTIVATE WINDOW OPENFILE
  1707.  
  1708.       @ 0, 0 TO nHigh - 1, nWidth - 1 DOUBLE COLOR w+/w
  1709.       @ 0, 2 SAY "[ ]" COLOR w+/w
  1710.       @ 0, 3 SAY CHR( 254 ) COLOR g+/w
  1711.       @ 0, 22 SAY " Open file" COLOR w+/w
  1712.  
  1713.       nRtn = -1
  1714.     ELSE
  1715.       *-----------------------------------
  1716.       *-- Check for click on a live object
  1717.       *-----------------------------------
  1718.       nRtn = 0
  1719.       i = 1
  1720.       DO WHILE i <= nClkObj
  1721.         IF nMRow =  aClkObj[ i, 1 ] + nXOffSet .AND. ;
  1722.            nMCol >= aClkObj[ i, 2 ] + nYOffset .AND. ;
  1723.            nMCol <= aClkObj[ i, 3 ] + nYOffset
  1724.           nRtn = aClkObj[ i, 4 ]
  1725.           EXIT
  1726.         ENDIF
  1727.         i = i + 1
  1728.       ENDDO
  1729.  
  1730.       IF nRtn = 0
  1731.         *----------------------------------------------------------
  1732.         *-- Not found, check for a click in a Combo box or list box
  1733.         *----------------------------------------------------------
  1734.         IF nClkBox > 0
  1735.           i = 1
  1736.           DO WHILE i <= nClkBox
  1737.             IF nMRow >= aClkBox[ i, 1 ] + nXOffset .AND. ;
  1738.                nMRow <= aClkBox[ i, 1 ] + nXOffset + aClkBox[ i, 2 ] .AND. ;
  1739.                nMCol >= aClkBox[ i, 3 ] + nYOffset .AND. ;
  1740.                nMCol <= aClkBox[ i, 3 ] + nYOffset + aClkBox[ i, 4 ]
  1741.               nRtn = aClkBox[ i, 5 ] - 1
  1742.               aClkBox[ i, 6 ] = .T.
  1743.               EXIT
  1744.             ENDIF
  1745.             i = i + 1
  1746.           ENDDO
  1747.         ENDIF
  1748.       ENDIF
  1749.  
  1750.     ENDIF
  1751.   ENDIF
  1752.  
  1753. RETURN( nRtn )
  1754. *-- EOF: GetMsTo(  )
  1755.  
  1756.  
  1757. PROCEDURE MsHand
  1758. PARAMETERS pnMRow, pnMCol, pl_IsPop
  1759. *----------------------------------------------------------------------------
  1760. * NAME
  1761. *   MsHand -
  1762. *
  1763. * DESCRIPTION
  1764. *
  1765. * PARAMETERS
  1766. *   pnMRow     =
  1767. *   pnMCol     =
  1768. *   pl_IsPop   =
  1769. *
  1770. *----------------------------------------------------------------------------
  1771.   nMRow = pnMRow
  1772.   nMCol = pnMCol
  1773.   nMsEvent = KB_MOUSE
  1774.  
  1775.   IF pl_IsPop
  1776.     DO CASE
  1777.       CASE nCurrent = 5
  1778.         STORE BAR() TO nCS_FILE
  1779.         SAVE SCREEN TO CS_FILE_1
  1780.         KEYBOARD "{LeftArrow}"
  1781.       CASE nCurrent = 7
  1782.         STORE BAR() TO nCL_TYPE
  1783.         SAVE SCREEN TO CL_TYPE_1
  1784.         KEYBOARD "{LeftArrow}"
  1785.     ENDCASE
  1786.   ELSE
  1787.     KEYBOARD "{Ctrl-W}"
  1788.   ENDIF
  1789.  
  1790. RETURN
  1791. *-- EOP: MsHand WITH pnMRow, pnMCol, pl_IsPop
  1792.  
  1793.  
  1794. PROCEDURE Dispatch
  1795. *----------------------------------------------------------------------------
  1796. * NAME
  1797. *   Dispatch -
  1798. *
  1799. * DESCRIPTION
  1800. *
  1801. *----------------------------------------------------------------------------
  1802.   DO CASE
  1803.     CASE nCurrent = 5                    && CS_FILE_1
  1804.       DO DispCS
  1805.     CASE nCurrent = 7                    && CL_TYPE_1
  1806.       DO DispCL
  1807.     CASE nCurrent = 15                   && CK_READ_1
  1808.       DO DispCk
  1809.     CASE nCurrent = 19                   && BT_DEMO
  1810.       DO DispBt
  1811.     CASE nCurrent = 20                   && BT_OK
  1812.       DO DispBt
  1813.     CASE nCurrent = 21                   && BT_CANCEL
  1814.       DO DispBt
  1815.   ENDCASE
  1816.  
  1817. RETURN
  1818. *-- EOP: Dispatch
  1819.  
  1820.  
  1821. PROCEDURE DispCk
  1822. *----------------------------------------------------------------------------
  1823. * NAME
  1824. *   DispCk -
  1825. *
  1826. * DESCRIPTION
  1827. *
  1828. *----------------------------------------------------------------------------
  1829.   PRIVATE nPossNext
  1830.  
  1831.   DO CASE
  1832.     CASE nMess = KB_TAB
  1833.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1834.       DO GetNext WITH .T.
  1835.     CASE nMess = KB_SHIFTTAB
  1836.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1837.       DO GetNext WITH .F.
  1838.     CASE nMess = KB_UPARROW .OR. nMess = KB_LEFTARROW
  1839.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1840.       DO GetNext WITH .F., .T.
  1841.     CASE nMess = KB_DOWNARROW .OR. nMess = KB_RTARROW
  1842.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1843.       DO GetNext WITH .T., .T.
  1844.     CASE nMess = KB_SPACE
  1845.       DO TButton WITH BN_CLICKED, .F., nCurrent
  1846.  
  1847.     CASE nMess = KB_MOUSE
  1848.       nPossNext = GetMsTo()
  1849.       IF nPossNext > 0
  1850.         IF nPossNext = nCurrent
  1851.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1852.         ELSE
  1853.           DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1854.           DO GetNext WITH nPossNext, .F.
  1855.         ENDIF
  1856.       ENDIF
  1857.  
  1858.     CASE nMess = KB_ENTER
  1859.       IF nDlgDef > 0
  1860.         DO TButton WITH BN_CLICKED, .F., nDlgDef
  1861.       ENDIF
  1862.  
  1863.     OTHERWISE
  1864.       DO CkWaitAc
  1865.       IF nAccel > 0
  1866.         IF nAccel = nCurrent
  1867.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1868.         ELSE
  1869.           DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1870.           DO GetNext WITH nAccel, .F.
  1871.         ENDIF
  1872.       ENDIF
  1873.  
  1874.   ENDCASE
  1875.  
  1876. RETURN
  1877. *-- EOP: DispCk
  1878.  
  1879.  
  1880. PROCEDURE DispBt
  1881. *----------------------------------------------------------------------------
  1882. * NAME
  1883. *   DispBt -
  1884. *
  1885. * DESCRIPTION
  1886. *
  1887. *----------------------------------------------------------------------------
  1888.   PRIVATE nPossNext
  1889.   DO CASE
  1890.     CASE nMess = KB_TAB
  1891.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1892.       DO GetNext WITH .T.
  1893.     CASE nMess = KB_SHIFTTAB
  1894.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1895.       DO GetNext WITH .F.
  1896.     CASE nMess = KB_ENTER
  1897.       DO TButton WITH BN_CLICKED, .F., nCurrent
  1898.     CASE nMess = KB_MOUSE
  1899.       nPossNext = GetMsTo()
  1900.       IF nPossNext > 0
  1901.         IF nPossNext = nCurrent
  1902.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1903.         ELSE
  1904.           DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1905.           DO GetNext WITH nPossNext, .F.
  1906.         ENDIF
  1907.       ENDIF
  1908.     OTHERWISE
  1909.       DO CkWaitAc
  1910.       IF nAccel > 0
  1911.         IF nAccel = nCurrent
  1912.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1913.         ELSE
  1914.           DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1915.           DO GetNext WITH nAccel, .F.
  1916.         ENDIF
  1917.       ENDIF
  1918.   ENDCASE
  1919.  
  1920. RETURN
  1921. *-- EOP: DispBt
  1922.  
  1923.  
  1924. PROCEDURE DispCS
  1925. *----------------------------------------------------------------------------
  1926. * NAME
  1927. *   DispCS -
  1928. *
  1929. * DESCRIPTION
  1930. *
  1931. *----------------------------------------------------------------------------
  1932.  
  1933.   DO CASE
  1934.     CASE nMess = KB_TAB
  1935.       DO GetNext WITH .T.
  1936.     CASE nMess = KB_SHIFTTAB
  1937.       DO GetNext WITH .F.
  1938.     CASE nMess = KB_ENTER
  1939.       IF nDlgDef > 0
  1940.         DO GetNext WITH nDlgDef
  1941.         IF nCurrent = nDlgDef
  1942.           DO TButton WITH BN_CLICKED, .F., nDlgDef
  1943.         ENDIF
  1944.       ENDIF
  1945.  
  1946.     CASE nMess = KB_DOWNARROW .OR. ;
  1947.          nMess = KB_UPARROW
  1948.       *-----------------------------------------------
  1949.       *-- GENCODE - Do VALID code here from Memo field
  1950.       *-----------------------------------------------
  1951.       DO CASE
  1952.         CASE nCurrent = 5                && CS_FILE_1
  1953.             IF OpenFiVl( "CS_FILE_1" )                                          
  1954.             ENDIF
  1955.       ENDCASE
  1956.  
  1957.       DO TCombo WITH CBN_INLIST, .F., nCurrent
  1958.  
  1959.       IF nMsEvent = KB_MOUSE
  1960.         nPossNext = GetMsTo()
  1961.       ELSE
  1962.         IF nAccel > 0
  1963.           DO GetNext WITH nAccel
  1964.           RETURN
  1965.         ELSE
  1966.           nPossNext = 0
  1967.           DO CASE
  1968.             CASE nCurrent = 5
  1969.               aClkBox[ 1 ,6 ] = .F.
  1970.           ENDCASE
  1971.         ENDIF
  1972.       ENDIF
  1973.  
  1974.       nLastKey = LASTKEY()
  1975.       IF nLastKey = KB_ENTER
  1976.         IF nDlgDef > 0
  1977.           DO GetNext WITH nDlgDef
  1978.           IF nCurrent = nDlgDef
  1979.             DO TButton WITH BN_CLICKED, .F., nDlgDef
  1980.           ENDIF
  1981.         ENDIF
  1982.       ENDIF
  1983.  
  1984.       IF nPossNext > 0
  1985.         IF nPossNext <> nCurrent
  1986.           *-- User clicked to another field
  1987.           DO GetNext WITH nPossNext
  1988.         ELSE
  1989.           nMess = 0
  1990.         ENDIF
  1991.       ELSE
  1992.         DO CASE
  1993.           CASE nMess = KB_TAB
  1994.             DO GetNext WITH .T.
  1995.           CASE nMess = KB_SHIFTTAB
  1996.             DO GetNext WITH .F.
  1997.         ENDCASE
  1998.       ENDIF
  1999.  
  2000.     CASE nMess = KB_MOUSE
  2001.       nPossNext = GetMsTo()
  2002.       IF nPossNext > 0
  2003.         IF nPossNext <> nCurrent
  2004.           *-- User clicked to another field
  2005.           DO GetNext WITH nPossNext
  2006.         ELSE
  2007.           *-- User clicked inside of list box
  2008.           DO TCombo WITH CBN_INLIST, .F., nCurrent
  2009.  
  2010.           DO CASE
  2011.             CASE nCurrent = 5
  2012.               aClkBox[ 1 ,6 ] = .F.
  2013.           ENDCASE
  2014.           IF nMsEvent = KB_MOUSE
  2015.             nPossNext = GetMsTo()
  2016.           ELSE
  2017.             IF nAccel > 0
  2018.               DO GetNext WITH nAccel
  2019.               RETURN
  2020.             ELSE
  2021.               nPossNext = 0
  2022.             ENDIF
  2023.           ENDIF
  2024.  
  2025.           nLastKey = LASTKEY()
  2026.           IF nLastKey = KB_ENTER
  2027.             IF nDlgDef > 0
  2028.               DO TButton WITH BN_CLICKED, .F., nDlgDef
  2029.               RETURN
  2030.             ENDIF
  2031.           ENDIF
  2032.  
  2033.           IF nPossNext > 0
  2034.             IF nPossNext <> nCurrent
  2035.               *-- User clicked to another field
  2036.               DO GetNext WITH nPossNext
  2037.             ELSE
  2038.               nMess = 0
  2039.             ENDIF
  2040.           ELSE
  2041.             DO CASE
  2042.               CASE nMess = KB_TAB
  2043.                 DO GetNext WITH .T.
  2044.               CASE nMess = KB_SHIFTTAB
  2045.                 DO GetNext WITH .F.
  2046.             ENDCASE
  2047.           ENDIF
  2048.         ENDIF
  2049.       ENDIF
  2050.     CASE nMess = KB_CTRLW .AND. nAccel > 0
  2051.       DO GetNext WITH nAccel
  2052.  
  2053.     OTHERWISE
  2054.       DO CkWaitAc
  2055.       IF nAccel > 0
  2056.         IF nAccel <> nCurrent
  2057.           DO GetNext WITH nAccel
  2058.         ENDIF
  2059.       ENDIF
  2060.  
  2061.   ENDCASE
  2062.  
  2063. RETURN
  2064. *-- EOP: DispCS
  2065.  
  2066.  
  2067. PROCEDURE DispCL
  2068. *----------------------------------------------------------------------------
  2069. * NAME
  2070. *   DispCL -
  2071. *
  2072. * DESCRIPTION
  2073. *
  2074. *----------------------------------------------------------------------------
  2075.   PRIVATE nPossNext, lOkSelect
  2076.  
  2077.   DO CASE
  2078.     CASE nMess = KB_TAB
  2079.       DO GetNext WITH .T.
  2080.     CASE nMess = KB_SHIFTTAB
  2081.       DO GetNext WITH .F.
  2082.     CASE nMess = KB_MOUSE
  2083.       nPossNext = GetMsTo()
  2084.       IF nPossNext > 0
  2085.         IF nPossNext = nCurrent
  2086.           nMess = KB_MOUSE
  2087.         ELSE
  2088.           DO GetNext WITH nPossNext, .F.
  2089.         ENDIF
  2090.       ELSE
  2091.         IF nMess <> DLN_CANCEL
  2092.           nMess = 0
  2093.         ENDIF
  2094.       ENDIF
  2095.     CASE nMess = KB_CTRLW .AND. nAccel > 0
  2096.       DO GetNext WITH nAccel, .F.
  2097.     CASE nMess = KB_ENTER
  2098.       IF nDlgDef > 0
  2099.         DO TButton WITH BN_CLICKED, .F., nDlgDef
  2100.       ENDIF
  2101.     CASE nMess = KB_DOWNARROW .OR. ;
  2102.          nMess = KB_SPACE .OR. ;
  2103.          nMess = KB_UPARROW
  2104.  
  2105.       DO TCombo WITH CBN_DROPDOW, .F., nCurrent
  2106.  
  2107.       *-------------------------------
  2108.       *-- GENCODE - Do VALID code here
  2109.       *-------------------------------
  2110.       lOkSelect = .T.
  2111.       DO CASE
  2112.         CASE nCurrent = 7                && CL_TYPE_1
  2113.             lOkSelect = OpenFiVl( "CL_TYPE_1" )                                          
  2114.       ENDCASE
  2115.       IF .NOT. lOkSelect
  2116.         STORE 0 TO nMess, nMsEvent
  2117.       ENDIF
  2118.  
  2119.       IF nMsEvent = KB_MOUSE
  2120.         nPossNext = GetMsTo()
  2121.         IF nPossNext > 0
  2122.           IF nPossNext <> nCurrent
  2123.             *-- User clicked to another field
  2124.             DO GetNext WITH nPossNext, .F.
  2125.           ENDIF
  2126.         ENDIF
  2127.       ELSE
  2128.         DO CASE
  2129.           CASE nMess = KB_TAB
  2130.             DO GetNext WITH .T.
  2131.           CASE nMess = KB_SHIFTTAB
  2132.             DO GetNext WITH .F.
  2133.           CASE nAccel > 0
  2134.             DO GetNext WITH nAccel, .F.
  2135.         ENDCASE
  2136.       ENDIF
  2137.  
  2138.     OTHERWISE
  2139.       DO CkWaitAc
  2140.       IF nAccel > 0
  2141.         IF nAccel <> nCurrent
  2142.           DO GetNext WITH nAccel, .F.
  2143.         ENDIF
  2144.       ENDIF
  2145.  
  2146.   ENDCASE
  2147.  
  2148. RETURN
  2149. *-- EOP: DispCl
  2150.  
  2151.  
  2152. PROCEDURE GetNext
  2153. PARAMETERS p__dir, pl_SameGrp
  2154. *----------------------------------------------------------------------------
  2155. * NAME
  2156. *   GetNext -
  2157. *
  2158. * DESCRIPTION
  2159. *
  2160. * PARAMETERS
  2161. *   p__dir     = .T. to go forward, .F. to go back, number to go to
  2162. *                record number.
  2163. *   pl_SameGrp = .F. to go to first item in next/prev group, .T. will
  2164. *                go to the next/prev item within the same group.  Only
  2165. *                applies to p__dir being next/previous.
  2166. *
  2167. *----------------------------------------------------------------------------
  2168.   PRIVATE cPrevClass, nWay, npCurrent, nPointer, nNextObj, nNextPtr
  2169.   PRIVATE nRecNo, npRecNo, lExit, cField, cVar, cCurrClass
  2170.   *--------------------------------------------------------------
  2171.   *-- Check for OK conditions, unless its a direct move to cancel
  2172.   *--------------------------------------------------------------
  2173.   IF ( TYPE( 'p__dir' ) = "N" .AND. p__dir <> nCancelBt ) .OR. ;
  2174.      TYPE( 'p__dir' ) = "L"
  2175.     DO CASE
  2176.       CASE nCurrent = 5                  && CS_FILE_1
  2177.         IF .NOT. OpenFiVl( "CS_FILE_1" )
  2178.            RETURN
  2179.         ENDIF
  2180.       CASE nCurrent = 7                  && CL_TYPE_1
  2181.         IF .NOT. OpenFiVl( "CL_TYPE_1" )
  2182.            RETURN
  2183.         ENDIF
  2184.     ENDCASE
  2185.   ENDIF
  2186.  
  2187.  
  2188.   *------------------------------------------
  2189.   *-- Check for move out of the current group
  2190.   *------------------------------------------
  2191.   IF .NOT. pl_SameGrp
  2192.     IF TYPE( "p__dir" ) = "L"
  2193.       DO HasTitle WITH nCurrent, BN_UNHILITE
  2194.     ENDIF
  2195.   ENDIF
  2196.  
  2197.   cPrevClass = LEFT( aClkObj[ aObjPoint[ nCurrent ], 11 ], 3 )
  2198.  
  2199.  
  2200.   *--------------------------------------------------
  2201.   *-- Set the current CK or RB pointer before leaving
  2202.   *--------------------------------------------------
  2203.   DO CASE
  2204.     CASE nCurrent = 15                   && CK_READ_1
  2205.       STORE nCurrent TO nCK_READ
  2206.   ENDCASE
  2207.  
  2208.   *----------------------------------------
  2209.   *-- Handle the forward and backward moves
  2210.   *----------------------------------------
  2211.   IF TYPE( "p__dir" ) = "L"
  2212.     DO CASE
  2213.       *-------------------------------------------
  2214.       *-- Go forward or backward in the same group
  2215.       *-------------------------------------------
  2216.       CASE  pl_SameGrp
  2217.         nWay = IIF( p__dir, 10, 9 )  && 10 Forward, 9 Back
  2218.         npCurrent = aObjPoint[ nCurrent ]
  2219.         nPointer = npCurrent
  2220.         *-----------------------------------------------
  2221.         *-- Is this a one item radio button or check box
  2222.         *-----------------------------------------------
  2223.         IF aClkObj[ npCurrent, 4 ] <> aClkObj[ npCurrent, nWay ]
  2224.           DO WHILE .T.
  2225.             *------------------------------------------------------
  2226.             *-- Check to see if the next object's WHEN clause is Ok
  2227.             *------------------------------------------------------
  2228.             nNextObj = aClkObj[ nPointer, nWay ]
  2229.             IF WhenOk( nNextObj )
  2230.               nPointer = aObjPoint[ nNextObj ]
  2231.               EXIT
  2232.             ELSE
  2233.               *-----------------------------------------------
  2234.               *-- See if we looped back to the item we were on
  2235.               *-----------------------------------------------
  2236.               nNextPtr  = aObjPoint[ nNextObj ]
  2237.               IF nNextPtr = npCurrent
  2238.                 EXIT
  2239.               ELSE
  2240.                 nPointer = nNextPtr
  2241.               ENDIF
  2242.             ENDIF
  2243.           ENDDO
  2244.         ENDIF
  2245.         IF nPointer <> npCurrent
  2246.           nCurrent = aClkObj[ nPointer, 4 ]
  2247.           nCurrGrp = aClkObj[ nPointer, 5 ]
  2248.         ENDIF
  2249.       OTHERWISE
  2250.         nWay = IIF( p__dir, 6, 7 )  && 6 Forward, 7 Back
  2251.         nRecNo = nCurrent
  2252.         npRecNo = aObjPoint[ nRecNo ]
  2253.         lExit = .F.
  2254.         DO WHILE aClkObj[ npRecNo, 5 ] = nCurrGrp
  2255.           nRecNo = aClkObj[ npRecNo, nWay ]
  2256.           npRecNo = aObjPoint[ nRecNo ]
  2257.           IF aClkObj[ npRecNo, 5 ] = nCurrGrp
  2258.             LOOP
  2259.           ELSE
  2260.             *--------------------------------------------------
  2261.             *-- Finally, we have moved out of the current group
  2262.             *--------------------------------------------------
  2263.             nCurrGrp = aClkObj[ npRecNo, 5 ]
  2264.             IF .NOT. WhenOk( nRecNo )
  2265.               LOOP
  2266.             ELSE
  2267.               nCurrent = nRecNo
  2268.               lExit = .T.
  2269.             ENDIF
  2270.           ENDIF
  2271.  
  2272.           *---------------------------------------------------------
  2273.           *-- Was this a move into a radio button or check box group
  2274.           *---------------------------------------------------------
  2275.           cField = aClkObj[ npRecNo, 11 ]
  2276.           cVar   = "N" + LEFT( cField, RAT( "_", cField ) - 1 )
  2277.           DO CASE
  2278.             CASE cVar = "NCK_READ"
  2279.               nRecNo = NCK_READ
  2280.               npRecNo = aObjPoint[ nRecNo ]
  2281.               nCurrent = nRecNo
  2282.               nCurrGrp = aClkObj[ npRecNo, 5 ]
  2283.           ENDCASE
  2284.           IF lExit
  2285.             EXIT
  2286.           ENDIF
  2287.         ENDDO
  2288.  
  2289.         DO HasTitle WITH nCurrent, BN_HILITE
  2290.  
  2291.     ENDCASE
  2292.  
  2293.   ELSE
  2294.  
  2295.     *-------------------------------------------------------
  2296.     *-- Handle direct moves to objects via Alt key and Mouse
  2297.     *-------------------------------------------------------
  2298.     IF .NOT. WhenOk( p__dir )
  2299.       nMess = 0
  2300.       RETURN
  2301.     ENDIF
  2302.  
  2303.  
  2304.     IF nCurrGrp <> aClkObj[ aObjPoint[ p__dir ], 5 ]
  2305.       DO HasTitle WITH nCurrent, BN_UNHILITE
  2306.       DO HasTitle WITH p__dir, BN_HILITE
  2307.       nCurrent = p__dir
  2308.       nCurrGrp = aClkObj[ aObjPoint[ nCurrent ], 5 ]
  2309.       DO CASE
  2310.         CASE nCurrent = 19
  2311.           DO TButton WITH BN_CLICKED, .F., nCurrent
  2312.         CASE nCurrent = 20
  2313.           DO TButton WITH BN_CLICKED, .F., nCurrent
  2314.         CASE nCurrent = 21
  2315.           DO TButton WITH BN_CLICKED, .F., nCurrent
  2316.       ENDCASE
  2317.     ELSE
  2318.       DO HasTitle WITH p__dir, BN_HILITE
  2319.     ENDIF
  2320.     nCurrent = p__dir
  2321.     nCurrGrp = aClkObj[ aObjPoint[ nCurrent ], 5 ]
  2322.  
  2323.   ENDIF
  2324.  
  2325.   *---------------------------------------------------------------
  2326.   *-- Repaint the Default button if we were on a button before and
  2327.   *-- the target is not a button.
  2328.   *---------------------------------------------------------------
  2329.   cCurrClass = LEFT( aClkObj[ aObjPoint[ nCurrent ], 11 ], 3 )
  2330.   IF cPrevClass = "BT_" .AND. cCurrClass <> "BT_"
  2331.     DO TButton WITH WM_PAINT, BN_DEFAULT, nDlgDef
  2332.     STORE .T. TO BT_OK
  2333.   ENDIF
  2334.  
  2335.   *---------------------------------------------------------
  2336.   *-- Save the current CK or RB pointer for the target group
  2337.   *---------------------------------------------------------
  2338.   DO CASE
  2339.     CASE nCurrent = 15                   && CK_READ_1
  2340.       STORE nCurrent TO nCK_READ
  2341.       IF TYPE( "p__dir" ) = "N"
  2342.         DO TButton WITH BN_CLICKED, .F., nCurrent
  2343.       ENDIF
  2344.     CASE nCurrent = 19                   && BT_DEMO
  2345.       STORE nCurrent TO nBT
  2346.       IF TYPE( "p__dir" ) = "N"
  2347.         STORE .T. TO BT_DEMO
  2348.       ENDIF
  2349.     CASE nCurrent = 20                   && BT_OK
  2350.       STORE nCurrent TO nBT
  2351.       IF TYPE( "p__dir" ) = "N"
  2352.         STORE .T. TO BT_OK
  2353.       ENDIF
  2354.     CASE nCurrent = 21                   && BT_CANCEL
  2355.       STORE nCurrent TO nBT
  2356.       IF TYPE( "p__dir" ) = "N"
  2357.         STORE .T. TO BT_CANCEL
  2358.       ENDIF
  2359.   ENDCASE
  2360.  
  2361. RETURN
  2362. *-- EOP: GetNext WITH p__dir, pl_SameGrp
  2363.  
  2364.  
  2365. FUNCTION WhenOk
  2366. PARAMETERS pnTarget
  2367. *----------------------------------------------------------------------------
  2368. * NAME
  2369. *   WhenOk - Validate the WHEN condition for a target object
  2370. *
  2371. * DESCRIPTION
  2372. *
  2373. * PARAMETERS
  2374. *   pnTarget   = Object ID to verify against
  2375. *
  2376. *----------------------------------------------------------------------------
  2377.   PRIVATE lWhenOk
  2378.   lWhenOk = .T.
  2379.  
  2380.   DO CASE
  2381.     CASE pnTarget = 7                    && CL_TYPE_1
  2382.       IF .NOT. ( OpenFiWn( "CL_TYPE_1" ) )
  2383.         lWhenOk = .F.
  2384.       ENDIF
  2385.   ENDCASE
  2386.  
  2387. RETURN lWhenOk
  2388. *-- EOF: WhenOk( pnTarget )
  2389.  
  2390.  
  2391. FUNCTION GetId
  2392. PARAMETERS pcVar
  2393. *----------------------------------------------------------------------------
  2394. * NAME
  2395. *   GetId() - Search for memvar name and return current_id
  2396. *----------------------------------------------------------------------------
  2397.   PRIVATE nId
  2398.   nId = 0
  2399.  
  2400.   DO CASE
  2401.     CASE pcVar = "CS_FILE_0"
  2402.       nId = 3
  2403.     CASE pcVar = "CL_TYPE_0"
  2404.       nId = 4
  2405.     CASE pcVar = "CS_FILE_1"
  2406.       nId = 5
  2407.     CASE pcVar = "CL_TYPE_1"
  2408.       nId = 7
  2409.     CASE pcVar = "CK_READ_0"
  2410.       nId = 12
  2411.     CASE pcVar = "CK_READ_1"
  2412.       nId = 15
  2413.     CASE pcVar = "BT_DEMO"
  2414.       nId = 19
  2415.     CASE pcVar = "BT_OK"
  2416.       nId = 20
  2417.     CASE pcVar = "BT_CANCEL"
  2418.       nId = 21
  2419.   ENDCASE
  2420.  
  2421. RETURN( nId )
  2422. *-- EOF: GetId( pcVar)
  2423.  
  2424.  
  2425. PROCEDURE PostVals
  2426. *----------------------------------------------------------------------------
  2427. * NAME
  2428. *   PostVals -
  2429. *
  2430. * DESCRIPTION
  2431. *
  2432. *----------------------------------------------------------------------------
  2433.  
  2434.   IF TYPE( "OPENFILE[1]" ) <> "U"
  2435.  
  2436.     OPENFILE[ 1 ] = CS_FILE_1
  2437.     OPENFILE[ 2 ] = CL_TYPE_1
  2438.     OPENFILE[ 3 ] = CK_READ_1
  2439.     OPENFILE[ 4 ] = BT_DEMO
  2440.     OPENFILE[ 5 ] = BT_OK
  2441.     OPENFILE[ 6 ] = BT_CANCEL
  2442.  
  2443.   ENDIF
  2444.  
  2445. RETURN
  2446. *-- EOP: PostVals
  2447.  
  2448. PROCEDURE ReleObjs
  2449. *----------------------------------------------------------------------------
  2450. * NAME
  2451. *   ReleObjs - Scan the design DBF file and release the object variables
  2452. *
  2453. * DESCRIPTION
  2454. *
  2455. *----------------------------------------------------------------------------
  2456.   RELEASE POPUP CS_FILE_1
  2457.   RELEASE POPUP CL_TYPE_1
  2458.  
  2459. RETURN
  2460. *-- EOP: ReleObjs
  2461.  
  2462.  
  2463. PROCEDURE IOPENFILE
  2464. *----------------------------------------------------------------------------
  2465. * NAME
  2466. *   IOPENFILE  - Builds the Initialization array for this dialog box
  2467. *
  2468. * DESCRIPTION
  2469. *   IOPENFILE with create a routine that you can call or cut from this
  2470. *   file to run a dialog box and capture the data on exit.
  2471. *
  2472. *   To run the dialog box,
  2473. *     SET PROCEDURE TO OPENFILE
  2474. *     DO IOPENFILE
  2475. *   Running IOPENFILE with use the defaults from the SCR file.  The
  2476. *   array will remain in memory after execution.
  2477. *
  2478. *   REMEMBER, REGENERATING THE DIALOG BOX WILL OVERWRITE THIS PROCEDURE!
  2479. *
  2480. *----------------------------------------------------------------------------
  2481.  
  2482.   PUBLIC ARRAY OPENFILE[ 6 ]
  2483.     *-- CS_FILE_1 - XXXXXXXXXXXXXXX
  2484.     OPENFILE[ 1 ]    = "*.SCR" + SPACE( 75 )
  2485.  
  2486.     *-- CL_TYPE_1 - XXXXXXXXXXXXXXXXXXXXXXXXXXXXX [v]
  2487.     OPENFILE[ 2 ]    = [SCREEN FILES (*.SCR)] + SPACE( 13 )
  2488.  
  2489.     *-- CK_READ_1 - [ ] ~Read-only
  2490.     OPENFILE[ 3 ]    = .F.
  2491.  
  2492.     *-- BT_DEMO -  ~Demo dialog
  2493.     OPENFILE[ 4 ]    = .F.
  2494.  
  2495.     *-- BT_OK -    Ok
  2496.     OPENFILE[ 5 ]    = .T.
  2497.  
  2498.     *-- BT_CANCEL -  Cancel
  2499.     OPENFILE[ 6 ]    = .F.
  2500.  
  2501.   *--------------------------------------------------------------
  2502.   *-- FXL_Cancel is set to .T. is the user Cancels the dialog box
  2503.   *--------------------------------------------------------------
  2504.   FXL_Cancel = .F.
  2505.  
  2506.   *--------------------------------------------------------------
  2507.   *-- FXL_NoChng lets the dialog box know that the values in the
  2508.   *-- array are not different from the SCR file defaults.  This
  2509.   *-- will allow the dialog box to use the .WIN file for a faster
  2510.   *-- startup.
  2511.   *--------------------------------------------------------------
  2512.   FXL_NoChng = .T.
  2513.  
  2514.   DO OPENFILE
  2515.  
  2516.   IF .NOT. FXL_Cancel                   && The user clicked on OK
  2517.  
  2518.     *-----------------------------------
  2519.     *-- Put your Ok processing code here
  2520.     *-----------------------------------
  2521.  
  2522.   ENDIF
  2523.  
  2524.   RELEASE OPENFILE
  2525.  
  2526. RETURN
  2527. *-- EOP: IOPENFILE
  2528.